本帖最后由 程金 于 2012-9-22 11:55 编辑
public class TestReflect3{
public static void main(String[] args) throws Exception {
String str = "com.test.day14.Person";
Class clazz =Class.forName(str);
Constructor c = clazz.getConstructor(String.class,int.class);//获取到有参的构造方法,注意后面的参数都是对应的类型的class类型
Object o = c.newInstance("xiaoming",29);//用构造器的方法newInstance构造带参的文件类对象,这里的返回Person对象
System.out.println(o);
Field field = clazz.getDeclaredField("name");//取得私有的name字段
field.setAccessible(true);//强行访问
//field.set(o, "xiaoqiang");//<font color="blue">不明白 的是:这里如果不设置字段值,oo那里就是null,也就是说取不到有参构造器初始化的“xiaoming”</font>
------------------------------------------
反射根本不需要实例对象就能得到
因为Field field=clazz.getDeclaredField("name"),得到的是表示Person的Class类对象的Field类的成员变量的对象
它是一个类,它的获取跟Person类的实例对象无关,,他不是从你new的person实例对象中获取的,他是从Person的Class类对象中获取
没有实例对象也能获取这个Field类类对象,由于你在Person类中没有显式初始化;
所以通过反射获得的Field也没有显式初始化,所以是默认值null.
你在Person类中显式初始化就可以了. 改成:private String name="xiaoqing";
__________________________________________--
Object oo = field.get(o);//<font color="blue">如果上步set了o对应的field值,则可以正常取到“xiaoqiang”</font>
System.out.println(oo);
}
} |