一、先看看编写出的代码的执行过程:

二、研究类加载机制的意义
从上图可以看出,类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。
package zhongqiu.common.base;
public class ClassLoadDemo {
static {
System.out.println("ClassLoadDemo静态初始化块执行了!");
}
public static void main(String[] args) throws ClassNotFoundException {
ClassLoader loader2 = ClassLoadDemo.class.getClassLoader();
System.out.println(loader2);
// 使用ClassLoader.loadClass()来加载类,不会执行初始化块
// loader2.loadClass("zhongqiu.test.Test");
// 使用Class.forName()来加载类,默认会执行初始化块
// Class.forName("zhongqiu.test.Test");
// 使用Class.forName()来加载类,并指定ClassLoader,初始化时不执行静态块
Class.forName("zhongqiu.test.Test", false, loader2);
}
}
七、自定义ClassLoader
package zhongqiu.common.base.classload;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class MyClassLoader {
@SuppressWarnings("resource")
public static void main(String[] args)
throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
URL url = new URL("file:/D:/javaworkspace/JavaCommon/src/");
ClassLoader myloader = new URLClassLoader(new URL[] { url });
Class c = myloader.loadClass("zhongqiu.common.base.classload.Test");
Test t3 = (Test) c.newInstance();
}
}
在Java.lang包里有个ClassLoader类,ClassLoader 的基本目标是对类的请求提供服务,按需动态装载类和资
源,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这个类并初始化。
一个Java应用程序可以使用不同类型的类加载器。例如Web Application Server中,Servlet的加载使用开发
商自定义的类加载器, java.lang.String在使用JVM系统加载器,Bootstrap Class Loader,开发商定义的其他类
则由AppClassLoader加载。在JVM里由类名和类加载器区别不同的Java类型。因此,JVM允许我们使用不同
的加载器加载相同namespace的java类,而实际上这些相同namespace的java类可以是完全不同的类。这种
机制可以保证JDK自带的java.lang.String是唯一的。
八、
为什么要使用这种双亲委托模式呢?
原文:http://www.cnblogs.com/wangzhongqiu/p/6417955.html