类加载器(初始化)

类加载器(初始化),第1张

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化

类的加载

就是指将class文件读入内存,并为之创建一个 java.lang.Class 对象

任何类被使用时,系统都会为之建立一个 java.lang.Class 对象

类的连接

验证阶段:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致

准备阶段:负责为类的类变量分配内存,并设置默认初始化值

解析阶段:将类的二进制数据中的符号引用替换为直接引用

类的初始化

在该阶段,主要就是对类变量进行初始化

假如类还未被加载和连接,则程序先加载并连接该类

假如该类的直接父类还未被初始化,则先初始化其直接父类

假如类中有初始化语句,则系统依次执行这些初始化语句

注意:在执行第2个步骤的时候,系统对直接父类的初始化步骤也遵循初始化步骤1-3

创建类的实例

调用类的类方法

访问类或者接口的类变量,或者为该类变量赋值

使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

初始化某个类的子类

直接使用java.exe命令来运行某个主类

负责将.class文件加载到内存中,并为之生成对应的 java.lang.Class 对象

虽然我们不用过分关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行

全盘负责:就是当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入

父类委托:就是当一个类加载器负责加载某个Class时,先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类

缓存机制:保证所有加载过的Class都会被缓存,当程序需要使用某个Class对象时,类加载器先从缓存区中搜索该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存储到缓存区

ClassLoader:是负责加载类的对象

Java运行时具有以下内置类加载器

        1)Bootstrap class loader:它是虚拟机的内置类加载器,通常表示为null ,并且没有父null

        2)Platform class loader:平台类加载器可以看到所有平台类 ,平台类包括由平台类加载器或其祖先定义的Java SE平台API,其实现类和JDK特定的运行时类

       3) System class loader:它也被称为应用程序类加载器 ,与平台类加载器不同。 系统类加载器通常用于定义应用程序类路径,模块路径和JDK特定工具上的类

ClassLoader 中的两个方法

     1)   static ClassLoader getSystemClassLoader​():返回用于委派的系统类加载器

      2)  ClassLoader getParent​():返回父类加载器进行委派

boot strap

美 [buːt stræp]

模拟线路;辅助程序

短语

boot-strap 开机

boot strap processor 启动捆绑处理器 引导处理器

boot-strap test 开机试验

双语例句

Utilizing industry experience and training in law, contract management and sales, he was able to boot strap the fledgling start-up into business.

而他在法律、合同管理、以及销售方面的经验,让他成功的运作了这个项目,为公司节约了大量的成本。

In some embodiments a boot progress of a system boot Strap processor in a multi-processor system is monitored and a boot processor failure is detected using an Application processor.

在一些实施例中,使用应用处理器监视多处理器系统中系统自引导处理器的引导进度,并检测引导处理器故障。

In buying your snowboarding boots, you might deal with making a choice between a step-in and a strap-on snowboarding boot.

在买你的滑雪鞋,你可能会处理之间作个选择的跳跃式和捆绑式滑雪启动。

不同类加载器加载的类不可以互相调用

专业术语:定义类加载器、初始类加载器

在java中加载器分为4种:

1、appClassLoad 应用程序加载器

2、etcClassLoad 扩展类加载器

3、bootStrapClassLoad(root) 根加载器

4、自定义加载器

怎么理解 不同类加载器加载的类不可以互相调用?

当创建一个类Test时由appClassLoad类加载器加载,当引入变量String时,String根据双亲委派机制,一层一层往上查询,应该appClassLoad-》etcClassLoad-》bootStrapClassLoad最终由bootstrap加载,在这个过程种appClassLoad和etcClassLoad被定义位初始加载器,bootstrap被定义为定义类加载器,每个加载器当中都有一个命名空间,也就是记录表,记录着所有此类的初始类加载器,所以在Test类是以可使用到String的。

一个类通过不同的加载器,加载到方法区中,会生成两个不同的类,互相是不可以遇见的,而且在堆中也会生成不同的对象实例。

自定义类加载器是为了解决当.class文件不在classpath路径中时,寻找加载.class而存在的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8076300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存