美文网首页
java学习笔记之反射

java学习笔记之反射

作者: HelloWorldLJF | 来源:发表于2016-11-24 22:03 被阅读8次

    1.在java语言中,静态的成员变量,普通数据类型类等等都是对象,类也是对象,是java.lang.Class类的实例对象,任何一个类都是Class的实例对象,称为这个类的类类型,这个实例对象有三种表达方式

    (1)Class c1=类名.class  任何一个类都有一个隐含的静态成员变量class

    (2)Class c2=类的实例.getClass()  知道该类的实例对象后用getClass()方法获取

    (3)Class c3=null;

    c3=Class.forName("类的全称");

    c1=c2=c3,都代表了这个类的类类型,一个类只可能是Class类的一个实例对象,无论用哪种方法获取的都是同一个,我们可以通过类的类类型来创建对象实例,比如:

    Foo foo=(Foo)c1.newInstance() 得出来的结果进行强制类型转换就可以得到对象实例,但前提是Foo类必须要有无参构造方法

    2.加载类

    (1)c3=Class.forName("类的全称")不仅仅代表了类的类类型,还代表了动态加载类,编译时刻加载类是静态加载类,运行时刻是动态加载类

    (2)new创建类是静态加载类,在编译时刻就需要加载所有的可能用到的类,所以任何一个类出现问题都无法编译成功

    (3)动态加载类在运行时加载,可能用到的类出错在编译时不会报错,只有在用到时才会报错,但所有可能用到的类必须继承同一个接口才能方便调用

    3.基本的数据类型,void关键字也有类类型

    Class c1=int.class;

    Class c2=String.class;

    Class c3=void.class;

    4.方法也是对象,方法对象属于java.lang.reflect.Method类,一个成员变量就是一个Method类对象

    Class c=obj.getClass();

    c.getName();//获取类的名称

    Method[] ms=c.getMethods();//获取所有的public函数的方法对象,包括从父类继承来的

    而getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限,但不包括父类继承来的

    5.成员变量也是对象,.成员变量对象属于java.lang.reflect.Field类,用法与方法对象类似

    6.构造函数也是对象,java.lang.Constructor中封装了构造函数的信息,用法类似:

    7.获取一个方法的信息

    首先获取类的类类型,如:Class c1=类名.class

    通过方法名称和参数来获取,如:Method m=c.getMethod("方法名",new Class[]{int.class,int.class})

    或Method m=c.getMethod("方法名",int.class,int.class)

    方法的反射操作:通过m对象来调用方法,与用对象实例调用效果相同,例:

    m.invoke(a1,new Object[]{10,20))(a1为对象实例,new Object[]{10,20)为方法参数,没有可不写或为空new Object[]{}),效果等同于a1.方法名(10,20),如果有返回值,返回的是Object对象,要进行强制类型转换

    8.java中反射的操作都是编译后的操作,而java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了,所以编译之后集合的泛型是去泛型化的,所以绕过编译可以绕过泛型

    相关文章

      网友评论

          本文标题:java学习笔记之反射

          本文链接:https://www.haomeiwen.com/subject/ycfipttx.html