cargador de clases de encargo en ejecutar el análisis de las condiciones de carga de clase complejo
-
Ejemplo:
public class MyCat { public MyCat(){ System.out.println("MyCat is loaded by:"+this.getClass().getClassLoader()); } } public class MySample { public MySample() { System.out.println("MySample is loaded by :" +this.getClass().getClassLoader()); new MyCat(); //【重要】 } } public class MyTest17 { public static void main(String[] args) throws Exception { MyTest16 loader1 = new MyTest16("loader1"); Class<?> clazz = loader1.loadClass("Jvm.MySample"); //先加载 System.out.println("class : " + clazz.hashCode()); //如果注释掉该行,那么并不会实例化MySample对象,即MySample构造方法不会被调用 //因此不会实例化MyCat对象,即没有对Mycat进行主动使用,这里就不会加载MyCat Class ★ Object object = clazz.newInstance(); //再创建实例 } } (1)在注释掉★行的时候: 此时 Class<?> clazz = loader1.loadClass("Jvm.MySample"); 会加载MySample、MyCat,虽然在MySample的构造方法中有new Cat(),但是这两个类并没有被初始化。这里有一个预加载的概念以及该节下面最后一句的踪迹。 运行结果: class : 325040804 (2)在放开★行的时候: 运行结果: class : 325040804 MySample is loaded by :sun.misc.Launcher$AppClassLoader@18b4aac2 MyCat is loaded by:sun.misc.Launcher$AppClassLoader@18b4aac2
-
Análisis de los resultados:
- clase: 325040804 por la salida clazz.hashCode (), se carga la clase
- Las dos líneas siguientes y, puramente porque clazz.newInstance () método instancia un constructor llamada impreso, si las dos clases se cargan para su posterior análisis ->
-
Comentario fuera objeto Object = clazz.newInstance ();, dispuestas sobre las opciones de VM -XX: + TraceClassLoading
- Mira los resultados: (Mycat no se ha cargado !!!)
-
- **MyCat是否被加载,并不是取决于是否被主动使用!**这里可以回顾 “**主动加载**” 和 "**预加载**"。