- 在JAVA中,框架一般都会用到反射。学习反射,必须学习Class 类,这里的Class 中c 是大写的。java的类用于描述某一类事物,该类事物具体有什么属性,有什么功能。至于这个属性值具体是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。一般来讲,我们定义一个类 Person ,那么 Person 的对象我们可以通过new 直接创建,如: Person p1=new Person()。而Class 类不能直接new 来创建对象的,它的对象代表的是内存里面的一份字节码,因此只能这样创建:Class c1=Person.class。
- 获取各个字节码对应的实例对象有三种方法:
- (1) 类名.class ,例如 System.class;
- (2) 对象.getclass(),例如 new Person().getclass();
- (3) Class.forName(“类名”);例如,Class.forName(“java.util.Date”);
- 反射的时候,主要用第三种方法。
- 反射就是把java类中的各种成分映射成相应的java类。
- Method类可以得到每个类的方法。
- String str1 = "abc";
- Method methodCharAt = String.class.getMethod("charAt", int.class);
- System.out.println(methodCharAt.invoke(str1, 2)); //得到c
- 如果传递给Method对象的invoke()方法的第一个参数为null,这说明该Method对象对应的是一个静态方法。
- 获取某个类的所有构造方法:
- Constructor constructors[]=Class.forName(“java.lang.String”).getConstructors();//Constructor代表某个类中的一个构造方法。
- 获取某个构造方法:
- 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 类代表某个类中的一个成员变量。
- 比如定义一个Reflect 类
- public class Reflect {
- private int x;
- public int y;
- public Reflect(int x, int y) {
- this.x = x;
- this.y = y;
- }
- 通过ReflectPoint pt1 = new Reflect(2,4);
- Field fieldY = pt1.getClass().getField("y"); y的值为4。
- 但是需要记住fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值。
- Field fieldX = pt1.getClass().getField("x");是错误的,取不到X的值,因为x是private的,getField方法无法访问私有变量的,需要使用getDeclaredField方法。
- 最重要的一点,输出得到的值时候,System.out.println(fieldY.get(pt1));这可以直接打印输出Y的值为4,但是System.out.println(fieldX.get(pt1));却不能直接输出X,需要加上一行代码fieldX.setAccessible(true);之后才能显示,这称之为 暴力反射
复制代码
|
|