为了账号安全,请及时绑定邮箱和手机立即绑定

反射——Java高级开发必须懂的

难度入门
时长 1小时20分
学习人数
综合评分9.67
760人评价 查看评价
9.9 内容实用
9.6 简洁易懂
9.5 逻辑清晰
  • Method
    查看全部
  • Class类
    查看全部
  • //Foo的实例对象如何表示 Foo foo1 = new Foo();//foo1就表示出来了. //Foo这个类 也是一个实例对象,Class类的实例对象,如何表示呢 //任何一个类都是Class的实例对象,这个实例对象有三种表示方式 //第一种表示方式--->实际在告诉我们任何一个类都有一个隐含的静态成员变量class Class c1 = Foo.class; //第二中表达方式 已经知道该类的对象通过getClass方法 Class c2 = foo1.getClass(); /*官网 c1 ,c2 表示了Foo类的类类型(class type) * 万事万物皆对象, * 类也是对象,是Class类的实例对象 * 这个对象我们称为该类的类类型 */ //不管c1 or c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象 System.out.println(c1 == c2); //第三种表达方式 Class c3 = null; try { c3 = Class.forName("com.imooc.reflect.Foo"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(c2==c3); //我们完全可以通过类的类类型创建该类的对象实例---->通过c1 or c2 or c3创建Foo的实例对象 try { Foo foo = (Foo)c1.newInstance();//需要有无参数的构造方法 foo.print(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); }
    查看全部
    0 采集 收起 来源:Class类的使用

    2018-03-22

  • 方法的反射
    查看全部
  • Class类
    查看全部
  • Class类
    查看全部
    0 采集 收起 来源:Class类的使用

    2016-01-18

  • JAVA - Reflect专题
    查看全部
    0 采集 收起 来源:Class类的使用

    2016-01-18

  • Java反射机制——通过反射了解集合泛型的本质 1:反射的操作都是编译之后的操作;就是运行阶段 2:java中集合的泛型是防止错误输入的;只在编译阶段有效,只要绕过编译就无效啦 我们可以通过方法的反射来操作,绕过编译
    查看全部
  • text note
    查看全部
  • 通过Class,Method来认识集合泛型的本质 反射的操作都是编译之后的操作(即运行时刻的操作),因为源文件编译之后就是.class文件.反射操作就是通过类名或者对象名获取到Class对象,再对Class对象的操作.即Class、Method、Field等对象都是绕过编译,在运行时刻才执行的. List list1=new ArrayList(); List<String> list2=new ArrayList<String>(); 因为list2设置了泛型,所以不能添加非String类型的参数进集合. Class c1=list1.getClass(); Class c2=list2.getClass(); System.out.println(c1=c1); 如果都没设置泛型那么其类类型肯定一样.现在设置了泛型,但此结果却返回true,说明编译之后集合是去泛型化的.因此得出结论:Java中集合的泛型,是防止错误输入的,只在编译阶段有效.绕过编译之后泛型就无效了. 任何一个类,只有一个类类型.就算此类实例了两个不同属性值的对象,通过对象获取得到类的类类型也是一样的. 验证方法是:可以通过方法的反射来操作,绕过编译. public void test(){ Method m=c2.getMethod("add",Object.class); m.invoke(list2,10);//反射操作是运行时刻的操作.程序运行时是没有问题的,添加集合成功,即集合绕过了编译阶段,泛型也就失效.假如添加成功之后用foreach以字符串类型遍历,则会发生RuntimeException.因为整型与String类型不匹配. }
    查看全部
  • 获得方法Method对象,通过此对象的invoke(对象,参数列表)方法去调用此方法. 获取某个具体方法需要知道方法的名称和方法的参数列表.在Class类中有getMethod("方法名",参数列表)方法获取具体的一个方法,其中有两个参数,第一个参数是要获取的方法的方法名,第二个参数是要获取的方法的参数列表的类类型,只能获取public修饰的,getDeclareMethod(方法名,参数列表)则可以获取类自己声明的所有方法,都返回一个Method对象.与getMethods()方法不同,getMethods()方法获取的是Class对象对应类的所有public方法,返回的是一个Method对象数组,并不能获取一个确定的方法Method对象. Method类中提供invoke(obj,参数列表)方法通过反射机制调用该Method对象对应的方法,其中obj参数为调用Method对象对应的方法的对象.参数列表参数为调用Method对象对应的方法时需要传递的参数,没有参数的话则忽略.invoke()方法返回Object对象,此Object对象就是调用Method对象对应的方法返回的返回值.用invoke()方法调用方法的方式与对象.方法名()调用方法的方式两者效果完全一样. 要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型. Class B{ public void print(){ A a=new A(); Class c=a.getClass(); Method m=c.getDeclareMethod("add",int.class,int.class)//参数列表类类型有多少个就写多少个. Object o=m.invoke(a,10,15);//以前是直接a.add()调用方法.用反射即Method对象通过invoke()方法反操作a对象来调用Method对象对应的方法. } } Class A{ public void add(int a , int b){ System.out.println(a+b); } }
    查看全部
  • 3.获取Class对象所对应类的构造方法.构造方法也是一个对象,每一个构造方法对应一个Constructors对象. Class类的getConstructors()方法可以获取Class对象所对应类的所有public的构造方法,返回Constructor类型的数组.也可以用getDeclaredConstructors()方法获取Class对象所对应类的自身所有构造方法,不分访问权限.返回Constructor类型的数组. 构造方法没有返回值类型.可有参数,因此Constructor类中提供了getParameterTypes()方法返回此构造方法参数列表类型的类类型数组. Constructor类的getName()方法可以获取构造方法的名字. 要得到一个类的信息,首先要得到这个类的类类型,即该类对应的Class对象. public void print(){ Class c=Foo.class; Constructor[] cs=c.getDeclaredConstructors(); for(Constructor cons:cs){ System.out.println(cons.getName()); Class [] c2=cons.getParameterTypes(); for(int i=0; i<c2.length;i++){ System.out.print(c2[i].getName()+","); } } }
    查看全部
  • 3.获取Class对象所对应类的成员变量,在Java中成员变量也是对象.Field类封装了关于成员变量的操作,每个成员变量对应一个Field对象. 可以通过Class类的getFields()方法获取得到此Class对象对应的类的所有的public修饰的成员变量,返回的是Field类型的数组.通过遍历输出. 也可以通过Class类的getDeclaredFields()方法获取Class对象对应类自身的成员变量,不分访问权限.返回的也是Field类型的数组. Field类提供了getType()方法返回成员变量的类型的类类型(即成员变量类型.class).Field中也有getName()方法返回成员变量的名字. public void println{ Class c=Foo.class; Field []fs=c.getDeclaredFields(); for(Field field:fs){ Class fieldType=field.getType(); System.out.println(fieldType.getName()+" "+field.getName()); } }
    查看全部
  • Class类的常用方法 要获取类的信息,首先要获取类的类类型(Class对象). 1.获取Class对象所对应类的名称. getName();//类的全称 getSimpleName();//直接类名 2.获取Class对象所对应类的方法,在Java中方法也是对象,每个方法对应一个Method对象. 通过Class类的getMethods()方法返回的是Class对象所对应的类的所有public修饰的方法(包括父类继承来的),返回Method对象数组,再遍历数组.通过Method类的getName()方法即可获取到方法名. 也可以通过getDeclareMethods()方法获取Class对象所对应的类的所有本类方法(不分访问权限),不包括继承父类的方法,返回的也是一个Method对象数组. Method类中也提供一个getReturnType()方法,得到方法的返回值类型,返回的是返回值的类类型.(返回值类型.class,即Class类的对象) Method类中有getParameterTypes()方法得到方法的参数类型,返回的是参数列表的类型的类类型数组. public void print(){ Class c=Foo.class; Method[] ms=c.getMethods(); for(int i=0;i<ms.length;i++){ Class returnType=ms[i].getReturnType(); Class []paramType=ms[i].getParameterTypes(); System.out.println("方法返回值类型:"+returnType.getName()+"方法名:"+ms[i].getName()+"方法的参数类型列表:"); for(Class c:paramType){ System.out.print(c.getName()+","); } } }
    查看全部
  • 基本数据类型也存在类类型. Class c1=int.class;//c1表示int的类类型. Class c2=Integer.class//c2表示Integer类的类类型. c1和c2是不一样的. 一些在类声明的关键字也有其类类型,void、String等. 在Java中,每个类都有一个相应的Class对象,也就是说当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息.在运行期间,如果我们要产生某个类的对象,Java虚拟机会检查该类型的Class对象是否已被加载.如果没有被加载,JVM会根据类的名称找到.class文件并加载它.一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象 Class类有getName()方法,获取当前Class对象所对应类的全称.
    查看全部

举报

0/150
提交
取消
课程须知
童鞋们,学习本课程前需要熟悉Java面向对象的思想,并能掌握Java IO输入输出流、集合和泛型等知识。可参考慕课网Java入门的一、二、三季以及我的文件我做主——Java IO流课程。
老师告诉你能学到什么?
1、能够理解并应用反射机制。 2、能够了解反射机制在集合泛型中的应用。 3、有利于更好的学习框架等Java高级技术。

微信扫码,参与3人拼团

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!