理解Java类加载机制并非易事,这里我们以一个Java的HelloWorld来学习ClassLoader。ClassLoader加载com.anbai.sec.classloader.TestHelloWorld类重要流程如下:
ClassLoader会调用public Class<?> loadClass(String name)方法加载com.anbai.sec.classloader.TestHelloWorld类。- 调用
findLoadedClass方法检查TestHelloWorld类是否已经初始化,如果JVM已初始化过该类则直接返回类对象。 - 如果创建当前
ClassLoader时传入了父类加载器(new ClassLoader(父类加载器))就使用父类加载器加载TestHelloWorld类,否则使用JVM的Bootstrap ClassLoader加载。 - 如果上一步无法加载
TestHelloWorld类,那么调用自身的findClass方法尝试加载TestHelloWorld类。 - 如果当前的
ClassLoader没有重写了findClass方法,那么直接返回类加载失败异常。如果当前类重写了findClass方法并通过传入的com.anbai.sec.classloader.TestHelloWorld类名找到了对应的类字节码,那么应该调用defineClass方法去JVM中注册该类。 - 如果调用loadClass的时候传入的
resolve参数为true,那么还需要调用resolveClass方法链接类,默认为false。 - 返回一个被JVM加载后的
java.lang.Class类对象。
