- Class.forName()等同与Class.forName("XXX.XXX", true, CALLCLASS.class.getClassLoader());第二个参数表示是否初始化该类, 即调用类的静态块的语句及初始化静态成员变量, 不会调用'{}'和构造方法。
静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段A a = (A)Class.forName("pacage.A").newInstance(); 这和你 A a = new A(); 效果是类似的
-
可以说Class.forName("XXX.XXX", false, cl)执行过程是一致的。只是ClassLoader.loadClass()是更底层的操作。class loader的装载机制是parent delegate的模型。即ClassLoader cl = Thread.currentThread().getContextClassLoader(); Class clazz = cl.loadClass("XXX.XXX");//没有指定是否初始化的选项。只有执行clazz.newInstance();时才能够初始化类。
类的装载是委托给父class loader去查找,如果没有找到才用当前的class loader来查找。
3.newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?
它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。
那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
Java中工厂模式经常使用newInstance()方法来创建对象
newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
public class A {
static int i= 10;
static{
System.out.println("Static A");
}
{
System.out.println("{} A");
}
public A(){
System.out.println("Constructor A");
}
}
public class B extends A {
static int i= 10;
static{
System.out.println("Static B");
}
{
System.out.println("{} B");
}
public B(){
System.out.println("Constructor B");
}
}
代码
Class clazz = Class.forName("A");
参考
http://ludaojuan21.iteye.com/blog/243528