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

Java内存分析

image

image

image

public class Main {

    public static void main(String[] args) {

        /**
         * 1、加载到内存,产生一个Class对象
         * 2、链接,给静态变量value赋值默认值0
         * 3、初始化,如果实例化对象,<clinit>方法会将所有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类的静态代码块");
    }
}

类初始化发生的条件

image

类加载器

image

image

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"));
    }
}
posted @   振袖秋枫问红叶  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示