Java注解和反射03:类的加载过程


Java内存分析

public class Main {

    public static void main(String[] args) {

        /**
         * 1、加载到内存,产生一个Class对象
         * 2、链接,给静态变量value赋值默认值0
         * 3、初始化,如果实例化对象,方法会将所有static变量和代码块按顺序进行合并执行
         */
        Test test = new Test();
        System.out.println(Test.value);
    }
}

class Test{

    public Test(){

        System.out.println("Test类的构造方法");
    }

    /**
     * static是按顺序执行的
     */
    static int value = 100;

    static {

        value = 300;
        System.out.println("Test类的静态代码块");
    }
}

类初始化发生的条件

类加载器

public class Main {

    public static void main(String[] args) {

        /**
         * 获取系统类加载器
         */
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);

        /**
         * 获取系统类加载器的父类加载器——拓展类加载器
         */
        ClassLoader extClassLoader = systemClassLoader.getParent();
        System.out.println(extClassLoader);

        /**
         * 获取拓展类加载器的父类加载器——引导类加载器(C/C++)
         */
        ClassLoader bootClassLoader = extClassLoader.getParent();
        System.out.println(bootClassLoader);

        /**
         * 获取当前类的加载器
         */
        ClassLoader classLoader = Main.class.getClassLoader();
        System.out.println(classLoader);

        /**
         * 获取内置的类的加载器
         */
        try {

            ClassLoader objectClassLoader = Class.forName("java.lang.Object").getClassLoader();
            System.out.println(objectClassLoader);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        /**
         * 系统类加载器可以加载哪些路径下的类
         */
        System.out.println(System.getProperty("java.class.path"));
    }
}