黑马程序员-反射知识总结

时间:2023-02-18 21:54:14
---------------------- android培训、java培训、期待与您交流! ----------------------

反射的基石->Class类
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class
比如说众多的人用一个Person类来表示,而众多的Java类就是用Class类来表示的
又Person类的实例是张三李四一个个具体的人,而Class类的各个实例对象是各个在内存中的字节码,例如Person类的字节码,ArrayList类的字节码等等。
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型Class类型。
Class 不能实例化 即不能new
Class cls代表字节码
Class cls1=Person.class
Class cls2=Date.class
Class.forName("java.lang.String")(Class的静态方法)
作用:返回字节码
得到各个字节码对应的实例对象
1.类名.class,例如System.class
2.对象.getClass();例如new Date().getClass()
3.Class.forName("类名"),例如Class.forName("java.util.Date");
注意:数组类型的Class实例对象为Class.isArray()。
总之,只要是在源程序中出现的类型,都有各自的Class实例对象。

反射就是把Java类中的各种成分映射成相应的Java类
例如,一个Java类用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Filed,Method,Contructor,Package等等

构造方法的反射应用:
Constructor类代表某个类中的一个构造函数。
得到某一个类的构造方法Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class,int.class);
得到某个类所有的构造方法:Constructor[] constructors=Class.forName("java.lang.String").getConstructors;
创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)constructor.newInstance(new StringBuffe("abc"));
Class.newInstance()方法:
例子:String obj = (String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。(缓存机制)

成员变量的反射:
Filed类:代表某个类中的一个成员变量
Filed对象是对应到类上面的成员变量而不是对应到对象上的成员变量,要用该Filed对象去取某个对象上对应的值
对私有变量应该这样处理:Field fieldX = pt.getClass().getDeclaredField("x");fieldX.setAccessible(true);//暴力访问System.out.println(fieldX.get(pt));


---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima