Java中ClassLoader与Class.forName的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiong9999/article/details/84869980

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

}

猜你喜欢

转载自blog.csdn.net/xiong9999/article/details/84869980
今日推荐