-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ Java反射 java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class。Class类代表java类,它的各个实例对象对应各个类在内存中的字节码,如,Person类的字节码,Arraylist类的字节码等等。java类用于描述一类事物的共性,该类事物有什么属性,没什么属性,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。java程序中的各个java类,它们属于同一事物,可以用一个类来表示,这个类就是Class类;注意与小写class关键字的区别。
反射就是把java类中的各种成分反射成相应的java类。
如:一个java类就是用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也是用一个个的java类来表示。表示java类的Class类提供了一系列的方法来获得其中的变量、方法 、构造方法 、修饰符 、包等信息,这些信息就是用相应类的实例对象来表示,它们是Field ,Method, Constructor,Package,String等。
一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。
如何得到各个字节码对应的实例对象(class类型)。
1:类名.class,如,Thread.class。
2:对象.getClass(),如,new Reader.getClass();
3:Class.forName(“类名”);如,Class.forName("java.io.File");
总之,只要是在源程序中出现的类型,都有各自的Class实例对象,如:int[],void... ... Constructor类
Constructor类代表某个类中的一个构造方法。
得到某个类所有的构造方法:如,Constructor[] constructor=Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:如,Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);//获得方法时要用到类型
创建实例对象:
通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str= (String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型的实例对象
Field类代表某个类中的一个成员变量
问题:得到的Field的对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,关联的是哪个对象呢?所以字段fieldX代表的是x的定义,而不是具体的x变量。
示例代码:ReflectPoint point =new ReflectPoint(1,7);
Field y=point.getClass().getField("y");
System.out.println(y.get(point));
Field x=point.getClass().getDeclaredField("x");
x.setAccessible(true);
System.out.println(x.get(point)); 数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]使用;非基本类型的一维数组
,既可以当作Object类型使用,又可以当作Object[]类型使用。
|