1.2.3.Constructor类:
Constructor类代表某个类的一个构造方法。
得到某个类所有的构造方法:
Constructor[] constructor = Class.forName(“java.lang.String”).getConstructor();
得到某一个构造方法:
Constructor constructor =
Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
创建实例对象:String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
1.2.4.Field类:
Field代表某个类的一个成员变量。提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。
public void setAccessible(boolean flag) | 设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认为false。 |
public void set(Object obj,Object value) | 设置指定属性的值。 |
public Object get(Object obj) | 得到属性的值 |
问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,那关联的是哪个对象呢?
测试代码:
public class ReflectPoint { private int x; public int y; public ReflectPoint(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } } 测试代码: ReflectPoint pt1 = new ReflectPoint(3,5); Field fieldY = pt1.getClass().getField("y"); //fieldY的值是多少?是5,错!fieldY不是对象身上的变量, //而是类上,要用它去取某个对象上对应的值 System.out.println(fieldY.get(pt1)); Field fieldX = pt1.getClass().getField("x");//出错,由于x是私有的 Field fieldX = pt1.getClass().getDeclaredField("x"); fieldX.setAccessible(true); System.out.println(fieldX.get(pt1)); 结论: Field对象是对应到类上面的成员变量,而不是对应到对象上的成员变量,Field对象的get方法可以对象的成员变量的值。 |
练习:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的“b”改成“a”。
代码如下:
新建一个类Bean.java public class Bean { public String str1 = "ball"; public String str2 = "basketball"; public String str3 = "itgroup"; } 新建一个客户端测试代码: Bean obj = new Bean(); Field[] fields = obj.getClass().getFields(); for(Field field : fields){ if(field.getType() == String.class){ String oldValue = (String)field.get(obj); String newValue = oldValue.replace('b', 'a'); field.set(obj, newValue); } } |