Java高级Day43-类加载

news2024/11/13 0:07:39

117.类加载

静态和动态加载

反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载

  1. 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强

  2. 动态加载:运行时加载需要的类,如果运行时不用该类,则不报错,降低了依赖性

public class ClassLoad_ {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入key");
        String key = scanner.next();
        switch(key) {
            case "1":
                Dog dog = new Dog();//静态加载,依赖性强
                dog.cry();
                break;
            case "2":
                //反射 -> 动态加载
                Class cls = Class.forName("Person");
                Object o = cls.newInstance();
                Method m = cls.getMethod("hi");
                m.invoke(o);
                System.out.println("ok");
                break;
            defalut:
                System.out.println("do nothing...")
        }
    }
}
​
//因为new Dog() 是静态加载,因此必须编写Dog
//Person类是动态加载,所以没有编写Person也不会报错,执行到Person类才会报错

类的加载时机

  1. 当创建对象时(new)

  2. 当子类被加载时,父类也加载

  3. 调用类中的静态成员时

  4. 通过反射

类加载流程图

image-类加载

加载和连接是由JVM机控制的,初始化是程序员可以自己控制的

类加载五个阶段

加载阶段:

JVM在该阶段的主要目的是将字节码从不同的数据源(class文件,jar包等)转化为二进制字节流加载到内存中,并生成一个代表该类的java.lang.Class对象

连接阶段---验证:

  1. 目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全

  2. 包括:文件格式验证(是否以魔数oxcafebabe开头)、元数据验证、字节码验证和符号验证引用

  3. 可以考虑使用-Xverify:none 参数来关闭大部分的类验证措施,缩短虚拟机类加载的时间

连接阶段---准备:

  1. JVM会在该阶段对静态变量,分配内存并默认初始化(对应数据类型的默认初始值,如0,0L,null,false等)这些变量所使用的内存都将在方法区中进行分配

  2. public class Class01 {
        public static void main(String[] args) {
            //说明一下类加载的链接阶段-准备
        }
    }
    class A{
        //属性-成员变量-字段
        //分析类加载的链接阶段-准备 属性是如何处理
        //1. n1是实例属性,不是静态变量,因此在准备阶段,是不会分配内存的
        //2. n2是静态变量,分配内存 n2是默认初始化0,在初始化阶段变为20
        //3. n3是static final是常量,它和静态变量不一样,会一次性分配,因为一旦赋值就不变,准备阶段就是30
        public int n1 = 10;
        public static int n2 = 20;
        public static final  int n3 =30;
    }

连接阶段-准备:

虚拟机将常量池内的符号引用替换为直接引用的过程

初始化阶段:

  1. 到初始化阶段,才真正开始执行类中定义的Java程序代码,此阶段是执行< client >()方法的过程

  2. < client >()方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并进行合并

    public class Class01 {
        public static void main(String[] args) {
            //演示类加-初始化阶段
            //1.加载B类,并生成B的class对象
            //2.链接 num = 0
            //3.初始化阶段  依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并合并
            /*
                   clinit() {
                       System.out.println("B 静态代码块被执行..")
                       //num = 300;
                       num = 100;
                   }
                   合并:num = 100
             */
            //4.new后会多 "A()的构造器被执行..."
    ​
            //new A();//会导致类加载
            System.out.println(A.num);//100,如果直接使用类的静态属性,也会导致类的加载
        }
    }
    class A{
        static {
            System.out.println("A的静态代码块被执行...");
            num = 300;
        }
    ​
        static int num = 100;
        public A() {
            System.out.println("A()的构造器被执行...");
        }
    }
  3. 虚拟机会包装一个类的< client >()方法在多线程环境中被正确的加锁,同步,如果多个线程同时区初始化一个类,那么只会有一个线程去执行这个类的< client >()方法,其他线程都需要阻塞等待,知道活动线程执行< client >()方法完毕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集群聊天服务器项目【C++】(五)网络模块和业务模块

经过前面介绍相关的库和工具&#xff0c;比如Json、CMake、muduo等&#xff0c;我们可以开始编写本项目的代码了。 1.项目目录创建 一般一个项目由以下结构组成&#xff1a; bin文件夹存放&#xff1a;可执行程序build文件夹存放&#xff1a;编译过程中的临时文件include文…

消失的数去哪里了

大家好&#xff0c;我是大圣&#xff0c;最近消失了很长一段时间了&#xff0c;之前答应粉丝要更新的文章也没有按时更新。其实我这段时间去闭关修炼去了&#xff0c;现在满血归来啦&#xff0c;之前答应粉丝的文章都会陆续发出来的。 消失的 Count 去哪了 今天给大家分享一个…

BolckingQueue

队列 队列的特点先进先出&#xff08;FIFO&#xff09;。 如图&#xff1a; 进入队列的顺序是1&#xff0c;2&#xff0c;3&#xff0c;那么出队列的顺序只能是1&#xff0c;2&#xff0c;3&#xff0c;不可能是其他顺序&#xff0c;这是由队列的特点保证的。 保存数据的基本…

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象具有原对象属性的精确副本 基本数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;在浅拷贝过程中它们是通过值传递的&#xff0c;而不是引用传递&#xff0c;修改值并不…

基于yolov8的茶叶病害检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的茶叶病害检测系统&#xff0c;是利用深度学习技术&#xff0c;特别是YOLOv8这一先进的目标检测算法&#xff0c;来精准识别和监测茶叶生长过程中出现的各种病害。该系统通过无人机、地面机器人或固定摄像头等设备&#xff0c;定期采集茶园的高分辨率…

力扣刷题(6)

两数之和 II - 输入有序数组 两数之和 II - 输入有序数组-力扣 思路&#xff1a; 因为该数组是非递减顺序排列&#xff0c;因此可以设两个左右下标当左右下标的数相加大于target时&#xff0c;则表示右下标的数字过大&#xff0c;因此将右下标 - -当左右下标的数相加小于targ…

??Ansible——ad-hoc

文章目录 一、ad-hoc介绍二、ad-hoc的使用1、语法2、ad-hoc常用模块1&#xff09;shell模块2&#xff09;command模块3&#xff09;script模块4&#xff09;file模块5&#xff09;copy模块6&#xff09;yum模块7&#xff09;yum-repository模块8&#xff09;service模块9&#…

优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序

遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种启发式搜索算法&#xff0c;用于寻找复杂优化问题的近似解。它模拟了自然选择和遗传学中的进化过程&#xff0c;主要用于解决那些传统算法难以处理的问题。 遗传算法的基本步骤&#xff1a; 初始化种群&#xff0…

【GO语言】Go语言详解与应用场景分析,与Java的对比及优缺点

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. Go是一种开源编程语言&#xff0c;可以轻松构建简单、可靠和高效的软件。 文章目录 一、引言二、Go语言详解1. 简史2. 特点3. 核心库 三、应用场景四、与Ja…

comfyui中,sam detector与yoloworld图像分割算法测试以及影响

&#x1f356;背景 图像处理中&#xff0c;经常会用到图像分割&#xff0c;在默认的comfyui图像加载中就有一个sam detector的功能&#xff0c;yoloworld是前一段时间公开的一个更强大的图像分割算法&#xff0c;那么这两个差别大吗&#xff1f;在实际应用中有什么区别吗&…

普推知产:明知商标驳回也要去申请注册!

有个去年加的网友让普推知产商标老杨看在32类申请如何&#xff0c;去年是把33类的申请复审下来&#xff0c;这个网友想的名称都是存在已存在的商标名称&#xff0c;直接都是申请不下来的&#xff0c;需要申请和再加驳回复审。 去年那个在33类的名称&#xff0c;当时查过只有一个…

函数(下)

static 代码1的test函数中的局部变量i是每次进⼊test函数先创建变量&#xff08;⽣命周期开始&#xff09;并赋值为0&#xff0c;然后 &#xff0c;再打印&#xff0c;出函数的时候变量⽣命周期将要结束&#xff08;释放内存&#xff09;。 代码2中&#xff0c;我们从输出结果…

论文阅读-Demystifying Misconceptions in Social Bots Research

论文链接&#xff1a; https://arxiv.org/pdf/2303.17251 目录 摘要: Introduction Methodological issues Information leakage Cherry-picking&#xff08;采摘樱桃&#xff09; Straw-man methodology &#xff08;稻草人&#xff09; Data biases Conceptual issu…

Spring高手之路23——AOP触发机制与代理逻辑的执行

文章目录 1. 从整体视角学习Bean是如何被AOP代理的2. AOP代理的触发机制2.1 postProcessAfterInitialization方法源码分析2.2 wrapIfNecessary方法源码分析2.3 时序图演示触发机制 3. AOP代理逻辑的执行3.1 AOP代理如何使用拦截器3.2 proceed方法源码分析3.3 时序图 1. 从整体视…

【Linux】线程锁条件变量信号量生产消费者模型线程池

文章目录 线程概念线程控制接口和线程id线程优缺点线程互斥和条件变量锁和条件变量相关接口POSIX 信号量生产消费者模型阻塞队列实现生产消费者模型环形队列实现生产消费者模型简易懒汉线程池自旋锁和读写锁&#xff08;了解&#xff09; 线程概念 在操作系统的的视角下&#x…

SysML图例-农业无人机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

828华为云征文 | 华为云FlexusX实例下的Kafka集群部署实践与性能优化

前言 华为云FlexusX实例&#xff0c;以创新的柔性算力技术&#xff0c;为Kafka集群部署带来前所未有的性能飞跃。其灵活的CPU与内存配比&#xff0c;结合智能调度与加速技术&#xff0c;让Kafka在高并发场景下依然游刃有余。在828华为云企业上云节期间&#xff0c;FlexusX实例携…

亲测好用,ChatGPT 3.5/4.0新手使用手册,最好论文指令手册~

本以为遥遥领先的GPT早就普及了&#xff0c;但小伙伴寻找使用的热度一直高居不下&#xff0c;其实现在很简单了&#xff01; 国产大模型快200家了&#xff0c;还有很多成熟的国内AI产品&#xff0c;跟官网一样使用&#xff0c;还更加好用~ ① 3.5 大多数场景是够用的&#xff…

【Java】多线程:Thread类并行宇宙

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在现代编程中&#xff0c;多线程是提高程序性能和响应能力的一种重要手段。Java 通过 Thread 类和 Runnable 接口提供了丰富的线程管理功能。本文是对 Thread 类基本用法的总结。 线程创建 线程可以…

Ubuntu 22.04上安装Java JDK 8

在Ubuntu 22.04上安装Java JDK 8可以通过以下步骤完成&#xff1a; 前言 本文特别感谢浪浪云的赞助发布。浪浪云&#xff0c;其卓越的云服务和技术支持&#xff0c;一直致力于为用户提供高效、可靠的解决方案。无论是个人开发者、小型企业还是大型组织&#xff0c;浪浪云都能…