package com.ginger;
/**
* @author ginger
* @date 2019/11/14 9:38
*/
public class Test6 {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("java.lang.String");
ClassLoader cl = clazz.getClassLoader();
System.out.println(cl);
}
}
运行结果:
此时返回的类加载器为null,说明String是由根类加载器加载的
package com.ginger;
/**
* @author ginger
* @date 2019/11/14 9:38
*/
public class Test6 {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("java.lang.String");
ClassLoader cl1 = clazz.getClassLoader();
System.out.println(cl1);
Class clazz2 = Class.forName("com.ginger.C");
ClassLoader cl2 = clazz2.getClassLoader();
System.out.println(cl2);
}
}
class C{
}
运行结果:
此时类C的类加载器为:sun.misc.Launcher$AppClassLoader@73d16e93
$符分隔内部类与外部类,此时外部类为sun.misc.Launcher,内部类为AppClassLoader(系统类加载器)此时真正加载类C的是AppClassLoader
package com.ginger;
/**
* @author ginger
* @date 2019/11/14 10:47
*/
public class Test7 {
public static void main(String[] args) {
System.out.println(Child.num);
}
}
class Parent{
static{
System.out.println("Parent static block");
}
public static int num = 3;
public static void doSomething(){
System.out.println("Parent do something");
}
}
class Child extends Parent{
static {
System.out.println("Child static block");
}
}
输出结果:
说明子类并未被初始化,因为实际主动使用的还是父类
package com.ginger;
/**
* @author ginger
* @date 2019/11/14 11:07
*/
public class Test8 {
public static void main(String[] args) throws Exception{
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class clazz = cl.loadClass("com.ginger.simpleClass");
System.out.println(clazz);
System.out.println("----------------");
clazz = Class.forName("com.ginger.simpleClass");
System.out.println(clazz);
}
}
class simpleClass{
static{
System.out.println("simpleClass static block");
}
}
运行结果:
同样是加载一个类,用classload方法不是对类的主动使用就不会导致要加载的类进行初始化
而forName属于对类的主动使用,会将要加载的类进行初始化
获得当前类的ClassLoader
class.getClassLoader();
获得当前线程上下文的ClassLoader
Thread.currentThread().getContextClassLoader()
获得调用者的ClassLoader
DriverManager.getCallerClassLoader()