Java中ClassLoader與Class.forName的區別
阿新 • • 發佈:2018-12-10
Java中ClassLoader與Class.forName的區別
package com.demo.classLoader;
public class Main {
public static void main(String[] args) {
getClassLoaderParent();
forName1();
forName2();
forName3();
}
/**
* @Title: getClassLoaderParent
* @Date: 2018-12-07 9:31
* @Description: 類載入時的載入器,AppClassLoader->ExtClassLoader->null(BootstrapClass)
*/
private static void getClassLoaderParent() {
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println("classLoader:\t" + systemClassLoader);
ClassLoader parent1 = systemClassLoader.getParent();
System.out.println("parent1:\t" + parent1) ;
ClassLoader parent2 = parent1.getParent();
System.out.println("parent2:\t" + parent2);
}
/**
* @Title: forName1
* @Date: 2018-12-07 9:41
* @Description: 執行時,將類載入到JVM中,同時執行類中的static程式碼塊,對類的例項物件做初始化
*/
private static void forName1() {
try {
System. out.println("before forName1");
Class<?> aClass = Class.forName("com.demo.classLoader.DemoClass");
System.out.println("after forName1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* @Title: forName2
* @Date: 2018-12-07 9:43
* @Description: 在同一個JVM中,一個類的例項物件只有一個,也就是說該類中的static程式碼塊在類載入時就執行了,而且只執行一次
*/
private static void forName2() {
try {
System.out.println("before forName2");
Class<?> aClass1 = Class.forName("com.demo.classLoader.DemoClass", true, Main.class.getClassLoader());
System.out.println("after forName2");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* @Title: forName3
* @Date: 2018-12-07 9:44
* @Description: 類的載入方式是通過獲取當前類的ClassLoader的父類,進行載入(雙親委派)
*/
private static void forName3() {
try {
System.out.println("before forName3");
Class<?> aClass2 = ClassLoader.getSystemClassLoader().loadClass("com.demo.classLoader.DemoClass");
System.out.println("after forName3");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class DemoClass {
private DemoClass(String s) {
System.out.println("Constructor " + s);
}
static {
System.out.println("static DemoClass");
}
}