本帖最后由 程金 于 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); 
        } 
} |