类的加载机制、主动引用、被动引用、什么是类加载器、类加载器的分类、自定义类的加载器

类的加载机制、类加载器

      • 类的加载时机
        • 主动引用
        • 被动引用
      • 类加载器
        • 什么是类加载器
        • 类的加载器分类
        • 什么情况下需要自定义类的加载器

类的加载时机

主动引用

虚拟机规范中并没有强制约束何时进行加载,但是规范严格规定了只有下列六种情况必须对类进行加载:

  • 当遇到new.getstatic . putstatic或invokestatic这4条字节码指令时,比如|new一个对象,读取一个静态字段(未被final修饰)、或调用一个类的静态方法时。
    • 当jvm执行new指令时会加载类。即:当程序创建一个类的实例对象。
    • 当jvm 执行getstatic指令时会加载类。即:程序访问类的静态变量(不是静态常量,常量会被加载到运行时常量池)。
    • 当jvm执行putstatic指令时会加载类。即:程序给类的静态变量赋值。。当jvm执行「invokestatic 指令时会加载类。即:程序调用类的静态方法。
    • 使用java.lang.reflect包的方法对类进行反射调用时如Class.forname( “…”)|,或newInstance()等等。如果类没初始化,需要触发类的加载。
  • 加载一个类,如果其父类还未加载,则先触发该父类的加载。
  • 当虚拟机启动时,用户需要定义一个要执行的主类(包含main()方法的类),虚拟机会先加载这个类。
  • 当一个接口中定义了JDK8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了加载,则该接口要在实现类之前被加载。
被动引用

除过主动引用外,所有引用类的方式都不会触发加载,称为被动引用。

/*
被动引用的常见例子:
*///通过子类引用父类的静态字段,不会导致子类的加载
System.out.println(SubClass.value);//value字段在SubClass类的父类中定义//通过数组定义来引用类,不会触发此类的加载。该过程会对数组类进行加载,数
//组类是一个由虚拟机自动生成的、直接继承自Object的子类,其中包含了数
//组的属性和方法。
SuperClass[] sca = new SuperClass[10];//常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量
//的类,因此不会触发定义常量的类的加载。
System.out.println(ConstClass.HELLOWORLD);

类加载器

什么是类加载器

在类加载过程的加载阶段,通过类的完全限定名,获取描述类的二进制流的实现类,被称为“类的加载”。

类的加载器分类

从JVM虚拟机的角度来讲,只存在以下两种不同的类的加载器:

  • 启动类加载(Bootstrap ClassLoader):使用C++实现,是虚拟机的一部分。
  • 其它类的加载器:使用Java实现,独立于虚拟机,继承自抽象类java.lang.ClassLoader。

从Java来发人员的角度来看,类加载器可以划分的更细致一些:

  • 启动类加载器:该类加载器负责将存放在<JRE_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即便是放在lib中也不会被加载)类库加载到虚拟机中。例如Java.util.*java.io.*,java.lang.*类等常用基础都是由启动类加载器加载。启动类加载器无法被Java程序直接引用。
  • 扩展类加载器(Extension ClassLoader):该类加载器是由ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现,负责将<JRE_HOME>/lib/ext或者被java.ext.dir系统变量所指定路径中的所有类库加载到内存中,例如swing系列、内置的js引擎、xml解析器等以javax开头的扩展类库都是由扩展类加载器加载,开发者可以直接使用扩展类加载器。
  • 应用程序类加载器(Application ClassLoader):该类加载器是由AppClassLoader(sun.misc.Launcher$AppClassLoader)实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,因此也被称为系统类记载器。他负责加载用户类路径(ClassPath)上所指定的类库,比如:我们自己编写的定义类或地方三方jar包。开发者就可以直接使用这个类加载器,如果应用程序中没有定义过自己的类的加载器,一般情况下这个就是程序中默认的类加载器。
    在这里插入图片描述
public class classLoaderTest ipublic static void main(string[] args){//(启动类)系统类加载器:ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemclassLoader); //sun.misc.Launcher$AppclassLoader@73d16e93//扩展类加载器:ClassLoader extendclassLoader = systemclassLoader.getParent();System.out.println(extendclassLoader); //sun.misc.Launcher$ExtclassLoader@15db9742//引导类加载器:ClassLoader bootstrapclassLoader = extendclassLoader.getParent();System.out.println(bootstrapclassLoader); // null//用户自定义的类默认用系统类加载器ClassLoader classLoader = ClassLoaderTest.class.getclassLoader();system.out.println(classLoader);// sun.misc.Launcher$AppClassLoader@73d16e93}
}
什么情况下需要自定义类的加载器
  1. 隔离加载类。在某些框架内进行中间件与应用的模块之间进行隔离,吧类加载到不同的环境。
  2. 修改类加载方式。
  3. 扩展加载源。比如:从数据库、网络、电视机顶盒进行类加载。
  4. 防止源码泄露。比如:编译时字节码进行加密,需要通过自定义类加载器对字节码进行解密还原。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适应变化:动态预测在机器学习中的作用

一、介绍 机器学习 (ML) 中的动态预测是指随着新数据的出现而不断更新预测的方法。这种方法在从医疗保健到金融等各个领域越来越重要,其中实时数据分析和最新预测可以带来更好的决策和结果。在本文中,我将讨论机器学习中动态预测的概念、其优势、挑战以及在不同领域的…

约束满足问题改进技术:基于变量和赋值次序的启发式

回溯搜索的通用算法的问题与改进思路 • 需改善无信息回溯搜索算法的性能。 • 通用改进方法的思路&#xff1a; – 下一步该给哪个变量赋值&#xff0c; 按什么顺序给该变量赋值&#xff1f; – 每步搜索应该做怎样的推理&#xff1f; 当前变量的赋值会对其他未赋值变量产…

【Java EE初阶五】wait及notify关键字

1. wait和notify的概念 所谓的wait和notify其实就是等待、通知机制&#xff1b;该机制的作用域join类似&#xff1b;由于多个线程之间是随机调度的&#xff0c;引入wait和notify就是为了能够从应用层面上&#xff0c;干预到多个不同线程代码的执行顺序&#xff0c;此处的干预&a…

进程等待(wait和wait函数)【Linux】

进程等待 wait和wait函数【Linux】 进程等待的概念进程等待的必要性进程等待的方法wait函数waitpid函数 非阻塞等待和阻塞等待的对比阻塞等待&#xff1a;非阻塞等待 进程等待的概念 进程等待就是通过 wait/waitpid的方式&#xff0c;让父进程对子进程进行等待子进程退出并且将…

Planarized sentence representation for nested named entity recognition

原文链接&#xff1a; https://www.sciencedirect.com/science/article/pii/S0306457323000894?via%3Dihub Information Processing & Management 2023 介绍 问题 可以通过枚举span的方法来解决嵌套实体&#xff0c;然而目前的模型忽略了span之间的语义依赖关系&#xff…

2023我的编程之旅-地质人的山和水

引言 大家好&#xff0c;我是搞地质的。外行人有的说我们游山玩水&#xff0c;有的说我们灰头土脸&#xff0c;也有的说我们不是科学。 而我说&#xff0c;这是一门穷极一生青春&#xff0c;值得奉献的行业。这是一门贴近民生&#xff0c;又拥抱自然的学科。他的真理性在于探…

长见识!!!Java中除了消息队列之外,竟然还能这样实现异步任务

今年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验…

java进阶四-深入理解泛型和注解

泛型和注解是框架技术必备的技能 5 泛型5.1泛型理解5.1.1 泛型概念5.1.2 泛型的特点5.1.3 如何理解Java中的泛型是伪泛型&#xff1f;5.1.4 泛型的价值 5.2 泛型语法5.2.1 泛型类5.2.2 泛型接口3.2.3 泛型方法3.2.4泛型的上下边界3.2.5创建泛型数组 5.3泛型应用场景5.3.1数据库…

SQL Server注入之攻防技战法

那天下着很大的雨&#xff0c;母亲从城里走回来的时候&#xff0c;浑身就是一个泥人&#xff0c;那一刻我就知道我没有别的选择了 1.Mssql报错注入 0.判断数据库类型 1.爆当前用户名 2.爆版本 3.爆服务器名 4.判断数据库个数 5.获取全部数据库 语句只适合>2005 爆当前数据…

Windows下Jenkins自动化部署SpringBoot应用

Windows下Jenkins自动化部署SpringBoot应用 1、下载安装包 下载地址&#xff1a; 一个是 msi 程序&#xff1a; https://mirrors.aliyun.com/jenkins/windows/ 一个是 war 程序&#xff1a; https://get.jenkins.io/war-stable/ https://mirrors.jenkins.io/war/ 这里我…

机器人动力学一些笔记

动力学方程中&#xff0c;Q和q的关系(Q是sita) Q其实是一个向量&#xff0c;q(Q1&#xff0c;Q2&#xff0c;Q3&#xff0c;Q4&#xff0c;Q5&#xff0c;Q6)&#xff08;假如6个关节&#xff09; https://zhuanlan.zhihu.com/p/25789930 举个浅显易懂的例子&#xff0c;你在房…

GO语言笔记1-安装与hello world

SDK开发工具包下载 Go语言官网地址&#xff1a;golang.org&#xff0c;无法访问Golang中文社区&#xff1a;首页 - Go语言中文网 - Golang中文社区下载地址&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 尽量去下载稳定版本&#xff0c;根据使用系统下载压缩包格式的安装…