您的位置:首页 > 职场人生

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

2012-06-26 04:46 309 查看
---------------------- 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息