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

news2024/9/22 17:21:00

类的加载机制、类加载器

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

类的加载时机

主动引用

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

  • 当遇到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 i
    public 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.coloradmin.cn/o/1353853.html

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

相关文章

光子学考试

光子学 一二三四 一 a) Use a symmetry argument to find the expectation value of the electric dipole moment < e r > <\mathrm{er}> <er> of an atom in an eigenstate. 采用对称性论证找到原子在本征态中的电偶极矩 < e r > <\mathrm{er}&g…

鸿蒙南向开发—PWM背光(OpenHarmony技术)

背光驱动模型也是基于HDF框架开发的&#xff0c;整个框架如下&#xff1a; 现在以RK3568为例&#xff0c;来看看PWM背光整个驱动&#xff0c;这里使用的是PWM占空比控制的背光&#xff0c;默认基于hdf的pwm驱动已经OK&#xff01; 需要注意的是&#xff1a;这里是基于HDF实现的…

C++ 多态向下转型详解

文章目录 1 . 前言2 . 多态3 . 向下转型3.1 子类没有改进父类的方法下&#xff0c;去调用该方法3.2 子类有改进父类的方法下&#xff0c;去调用该方法3.3 子类没有改进父类虚函数的方法下&#xff0c;去调用改方法3.4 子类有改进父类虚函数的方法下&#xff0c;去调用改方法3.5…

捕捉“五彩斑斓的黑”:锗基短波红外相机的多种成像应用

红外处于人眼可观察范围以外&#xff0c;为我们了解未知领域提供了新的途径。红外又可以根据波段范围&#xff0c;分为短波红外、中波红外与长波红外。较短的SWIR波长——大约900nm-1700nm——与可见光范围内的光子表现相似。虽然在SWIR中目标的光谱含量不同&#xff0c;但所产…

JRT控制打印机

本次测试打印机控制和纸张方向控制。 打印机状态 选择打印机 控制纸张 定义纸张 旋转纸张 不旋转纸张 A4

java代码规范(适合写程序之前先了解有助于开发协同)

目录 一、类定义 二、方法定义 三、接口定义 四、变量定义 1、命名规范&#xff1a; 2、类型规范&#xff1a; 3、常量规范&#xff1a; 五、static关键字 1、静态变量&#xff08;类变量&#xff09;&#xff1a; 2、静态方法&#xff08;类方法&#xff09;&#x…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff09;…

Netty使用SSL实现双向通信加密

最近项目有个需求,TCP服务器实现基于证书通信加密,之前没做过,花了一些时间调研,今天整理下。 SSL(Secure Sockets Layer 安全套接字协议) 1、原理 算法原理 简而言之就是非对称加密算法 私钥自己持有,公钥发给对方,对方在发送信息的时候使用公钥进行加密数据,当接收到…

C++-类和对象(2)

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下 6 个默认成员 函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译…

【AI】DETR模型可视化操作

Detr作为目标检测的算法&#xff0c;不同于之前算法的就是注意力机制&#xff0c;注意力机制能够直观看出来模型对图像关注的点&#xff0c;这个直观到底怎么直观呢&#xff0c;我们只听别人说肯定是不行的&#xff0c;上手测试才是最好的方式&#xff0c;像论文中插图那样的使…

【网络流】最大流与Ford–Fulkerson算法

目录 一、引言1.1 网络流问题1.2 “流”的定义1.3 “割”的定义 二、最大流最小割2.1 最大流2.2 最小割2.3 最大流最小割定理2.4 最大流最小割定理证明 三、Ford–Fulkerson算法3.1 增广路径3.2 剩余图3.3 算法代码3.4 FordFulkerson Demo 一、引言 1.1 网络流问题 网络流问题…

【教学类-43-13】 20240103 (4宫格数独:错误版:768套) 不重复的基础模板数量:768套

作品展示&#xff1a;——4宫格 768套不重复模板&#xff08;64页*12套题&#xff09; 有错误&#xff0c;实际数量小于768套 背景需求&#xff1a; 测试4宫格数独基础模板有几种。 写个程序&#xff0c;验算是不是真的是乘阶法的288种。 代码展示&#xff1a; 768套4宫格题…

AI原生应用开发“三板斧”亮相WAVE SUMMIT+2023

面对AI应用创新的风口跃跃欲试&#xff0c;满脑子idea&#xff0c;却苦于缺乏技术背景&#xff0c;不得不望而却步&#xff0c;这曾是许多开发者的苦恼&#xff0c;如今正在成为过去。 12月28日&#xff0c;WAVE SUMMIT深度学习开发者大会2023在北京举办。百度AI技术生态总经理…

【Java 基础】-- 实例化

1、定义 创建对象的过程就叫实例化。这个过程中会在堆中开辟内存&#xff0c;将一些非静态的方法&#xff0c;变量存放在里面。在程序执行的过程中&#xff0c;可以创建多个对象&#xff0c;既多次实例化。每次实例化都会开辟一块新的内存。 2、实例化的几种方法 new 关键字创…

STM32学习笔记十七:WS2812制作像素游戏屏-飞行射击游戏(7)探索动画之故事板,复杂动画

要让物体沿着路径移动&#xff0c;必须同时修改X/Y两个值&#xff0c;用两个连续插值动画行不行&#xff1f; 在单片机这种单线程设备&#xff0c;两个TICK会前后脚进行修改&#xff0c;具有相同的时间跨度&#xff0c;所以似乎也是可以的。但是在支持多线程的设备&#xff0c…

【CVPR2023】使用轻量 ToF 传感器的单目密集SLAM的多模态神经辐射场

目录 导读 本文贡献 本文方法 轻量级ToF传感器的感知原理 多模态隐式场景表示 时间滤波技术 实验 实验结果 消融实验 结论 未来工作 论文标题&#xff1a;Multi-Modal Neural Radiance Field for Monocular Dense SLAM with a Light-Weight ToF Sensor 论文链接&am…

Java程序设计阶段测试1

一、单选题&#xff08;共15题&#xff1b; 共30.0分&#xff09; 2.0分 1、以下哪个是Java应用程序main方法的有效定义? A.public static void main(); B.public static void main( String args ); C.public static void main( String args[] ); D.public static boolea…

交换机02_共享式交换式

1、共享式网络 早期的以太网是共享式网络&#xff0c;它是由集线器&#xff08;HUB&#xff09;相连&#xff0c;由一个HUB相连了两台主机&#xff0c;形成一个冲突域也称广播域。 &#xff08;1&#xff09;相关名词解释 集线器 HUB中心的意思&#xff0c;集线器就是对接收…

VINS-MONO拓展1----手写后端求解器,LM3种阻尼因子策略,DogLeg,构建Hessian矩阵

文章目录 0. 目标及思路1. 非线性优化求解器2. 基于VINS-MONO的Marginalization框架构建Hessian矩阵2.1 estimator.cpp移植2.2 solve.cpp/preMakeHessian()2.3 solve.cpp/makeHessian() 3. solve.cpp/solveLinearSystem()求解正规方程4. 更新状态5. 迭代求解6. EVO评估结果7. 待…

drf知识--10

接口文档 # 后端把接口写好后&#xff1a; 登录接口&#xff1a;/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接&#xff0c;对接第一个东西就是这个接口文档&#xff0c;前端照着接口文档开发 公司3个人&#xff…