1. 程式人生 > >Java中ClassLoader與Class.forName的區別

Java中ClassLoader與Class.forName的區別

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"); } }