我相信实例比文字更能说明问题
Demo1,被加载的类
package com.text.hl;
public class Demo1 {
private int hl;
}
在这里我用junit单元测试测试的,去方法中加载Demo1类获得其私有成员变量并改变其值为指定的值,这里为200.大家也可以将此方法写在自己定义的类的Main方法中执行.依个人习惯和喜好而定.
@Test
public void testGetDemo1(){
try {
Object demo1=Class.forName("com.text.hl.Demo1").newInstance();
// 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field field=demo1.getClass().getDeclaredField("hl");
//跳过权限访问检查--暴力反射
field.setAccessible(true);
// 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
field.set(demo1, 200);
//返回指定对象上此 Field 表示的字段的值。
System.out.println(field.get(demo1));
} catch (Exception e) {
e.printStackTrace();
}
}
这是文档中的两个方法,帮助大家理解.
如果需要更深层次理解,下面有一些参考博客:
参考地址1:http://yanwushu.sinaapp.com/class_forname/
参考地址2:http://www.cnblogs.com/shosky/archive/2011/07/22/2114290.html
本人为了帮助大家理解,下面是本人通过查询文档和各种资料之后理解的东西,如有纰漏欢迎指出修改意见.
加载的Demo1这个类,通常我们想调用这个类中的方法和变量(当然都是public的) 就需要这样Demo1 demo= new Demo1();创建一个这个类的实例.也就是这个类的对象.这样就可以使用它了.
现在我们不通过new的方式获得它的对象(实例),通过反射的方式,Class.forName();类加载器,加载这个类,获得的是这个类的class对象,也就是其在JVM中class对象(万物皆对象),现在获得的只是相当于Demo1.getClass();类加载到JVM中的字节码,这时我们需要调用newInstance方法获得这个类的实例(对象),这样就可以使用它了.
也就是说new是一步完成了,forName和newInstance两步做的事情.