Java的每个类被编译成.class文件的时候,java虚拟机(jvm)会自动为这个类生成一个类对象(Xxx.Class),这个对象保存了这个类的所有信息(成员变量,方法,构造器等),以后这个类要想实例化(也就是创建类的实例或创建类的对象)那么都要以这个class对象为蓝图(或模版)来创建这个类的实例。
例如 class
重要函数
java.lang.Class
public Method getMethod(String name, Class<?>... parameterTypes)
java.lang.reflect.Method
public Object invoke(Object obj, Object... args)
第二项都为可变参数
Class.forName、new Object和ClassLoader.loadClass
测试程序
class TestObject {
static {
System.out.println("静态初始化");
}
public TestObject() {
System.out.println("构造方法");
}
}
public class TestDriver {
public static void main(String[] args) throws Exception {
//1. 使用loader.load加载
ClassLoader loader=TestDriver.class.getClassLoader();
loader.loadClass(TestObject.class.getName());
//2. 使用Class.forName加载
Class.forName(TestObject.class.getName());
//3. 使用new Object
TestObject object=new TestObject();
}
}
测试结果
- 使用loader.load加载
没有任何输出
使用Class.forName加载
静态初始化
使用new Object
静态初始化
构造方法
java加载过程
ClassLoader.loadClass只是完成了类的加载, 而Class.forName与new Object的方法已经完成了类的初始化,并且new Object创建了实例对象,所以调用了构造方法。
参考 http://blog.youkuaiyun.com/cjm812752853/article/details/53956122