这个例子很好的证明了,类加载和实例化的区别:
public class NewInstancesTest {
public static void main(String[] args) {
TestOne one=null;
try {
//类加载
Class cl=Class.forName("reflectTest.TestOne");//引号内的作用,是指定要加载类的位置
//实例化
one=(TestOne)cl.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//通过运行,我们可以看到,在类加载的时候,执行的是静态代码块
//而调用无参构造器的时候,……
}
}
class TestOne {
static {
System.out.println("执行静态代码块");
}
public TestOne() {
System.out.println("执行构造器");
}
}
说明:
在执行类加载的时候:
Class cl=Class.forName(“xxx.TestOne”),此时,程序会找到引号内那个位置的类,并加载到内存里,容易想到,该类的所有静态的内容会加载执行。
而后面的代码中:
TestOne one=null;
one=(TestOne)cl.newInstance();
这两句就是用的反射机制,将读取到的类反射到实例one中完成实例化。
至此,我算是明白了反射机制。不白费我两天的苦苦研究。