设为首页 加入收藏

TOP

day43-反射02(四)
2023-07-23 13:41:46 】 浏览:48
Tags:day43- 反射
是 由编译器按语句在源文件中出现的顺序,依次自动收集类中的 所有静态变量 的赋值动作 和 静态代码块中的语句,并进行合并。-->例子1
  • 虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,如果多线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。
  • 例子1:演示类加载的初始化阶段

    package li.reflection.classload_;
    
    //演示类加载的初始化阶段
    public class ClassLoad03 {
        public static void main(String[] args) {
            //分析:
            /**
             * 1.加载B类,并生成 B的Class对象
             * 2.链接 :将num默认初始化为 0
             * 3.初始化阶段:
             *    3.1依次 自动收集类中的 所有静态变量的赋值动作 和 静态代码块中的语句,并合并
             *      收集:
             *      clinit(){
             *          System.out.println("B的静态代码块被执行");
             *          num = 300;
             *          num = 100;
             *      }
             *      合并:num =100;
             */
    
            //直接使用类的静态属性也会导致类的加载
            System.out.println(B.num);//100
    
        }
    }
    
    class B {
        static {
            System.out.println("B的静态代码块被执行");
            num = 300;
        }
    
        static int num = 100;
    
        public B() {
            System.out.println("B的构造器被执行");
        }
    }
    
    image-20220928193333330

    例子2:

    在例子1中的程序里创建一个B类对象,打上断点,debug源码:

    image-20220928195002395

    可以看到在底层中,使用了对象锁synchronized (getClassLoadingLock(name)) :

    image-20220928194154742

    也就是说,加载类的时候,是有类的同步控制机制。

    正因为有这个机制,才能保证某个类在内存中,只有一份Class对象。

    首页 上一页 1 2 3 4 下一页 尾页 4/4/4
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇Jmix 中 REST API 的两种实现 下一篇mybatisplus不支持sum,但支持这个

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目