java基础1_Class.forName() ClassLoader.loadClass() 和new

  1. Class.forName()等同与Class.forName("XXX.XXX", true, CALLCLASS.class.getClassLoader());第二个参数表示是否初始化该类, 即调用类的静态块的语句及初始化静态成员变量, 不会调用'{}'和构造方法
    A a = (A)Class.forName("pacage.A").newInstance(); 
    这和你 
    A a = new A(); 
    效果是类似的
     静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 
  2.  
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    Class clazz = cl.loadClass("XXX.XXX");//没有指定是否初始化的选项。只有执行clazz.newInstance();时才能够初始化类。
     可以说Class.forName("XXX.XXX", false, cl)执行过程是一致的。只是ClassLoader.loadClass()是更底层的操作。class loader的装载机制是parent delegate的模型。即 
    类的装载是委托给父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

 

你可能感兴趣的:(Class.forName)