首页 > 编程知识 正文

java自定义异常的步骤,java类加载器有什么用

时间:2023-05-06 09:41:14 阅读:11901 作者:4360

类加载机制

JVA类从加载到JVM到卸载(加载(验证)准备(复制)分析(解决)初始化)初始化

其中,验证、准备、分析三个部分统称为链接。

1、加载

加载是指将java.lang.Class对象从类的. class文件中读取二进制数据,将其放在运行时数据区的方法区中,然后封装方法区中类的数据结构

的加载由作为程序运行基础的JVM提供的类加载器完成。 启动程序时,如果需要,可以使用java类加载机制classLoader将一个class文件动态加载到内存中,而不是一次加载程序使用的所有class文件。

jvm在运行时生成三个classLoader:

启动类加载器(BootStrap ClassLoader ):java类加载层次结构中的顶级类加载器,负责加载jdk核心类库。 由c实现,不是类加载器的子类。

扩展类加载器(Extension ClassLoader ) :负责加载java的扩展类库,如lib/ext和java.ext.dirs系统属性指定的目录中的jar包。 父类加载器为空。

系统类加载器(App ClassLoader ) :负责加载java命令的-classpath选项、java.class.path系统属性中指定的jar包和类路径。 程序可以从classLoader的静态方法getSystemClassLoader ()中检索系统类加载器。 以java语言实现,父类加载器为ext类加载器。

除了java默认提供的三个类加载器之外,用户还可以根据需要定义自己的类加载器。 所有这些自定义classLoader都必须从java.lang.ClassLoader类继承。

可以使用不同的类加载器从不同的源加载类的二进制数据。 通常有以下情况。

从本地文件系统加载class文件。 这是大多数实例程序的类加载方法。 从jar包中加载class类的方法也是常见的。 通过网络加载class类以动态编译java源文件,然后执行jsp等加载。

2、连接

加载类后,系统将生成相应的class对象,然后进入将类的二进制数据合并到jre中的连接阶段(验证-准备-分析)。

验证:用于检测加载的类是否具有正确的内部结构并与其他类协调。

有四种验证:文件格式验证、元数据验证、字节验证和符号引用验证。 准备:为类变量分配内存,并设置默认初始值。

分析:用直接引用替换类的二进制数据中变量的符号引用。

3、初始化

在初始化阶段,主要为类的静态变量提供正确的初始值。 实际上是执行类构造函数clinit ()方法的过程。

要在java类中为类变量指定初始值,请执行以下操作: a .在声明类变量时指定初始值;以及b .使用静态初始化块为类变量指定初始值。

jvm要初始化类,请执行以下操作:

执行步骤2,加载并连接类,首先初始化其直接父类,然后顺序执行初始化语句,系统还按照1到3初始化直接父类。

当类被积极引用时,初始化过程开始。

遇到new、getstatic、putstatic或invokestatic四字节代码指令时,如果类未初始化,则必须首先触发初始化。

生成这四个指令的最常见的Java代码场景是,在使用new关键字实例化对象时,在读取或设置用final限定的类的静态字段时,编译器将结果放在常量池中的静态字段除外

如果使用java.lang.reflect包中的方法在反射中调用类,则必须首先触发初始化(如果类尚未初始化)。

初始化类时,如果发现父类尚未初始化,则必须触发父类的初始化。 虚拟机启动时,用户必须指定要运行的主类(包含main ()方法的类)。 虚拟机首先初始化这个类。

使用jdk7动态语言支持时,java.lang.invoke.MethodHandle实例的最后一个分析结果REF_getStatic、REF_putStatic和REF_invokeStatic方法

如果类是被动引用,则不会启动初始化过程。

如果子类引用父类的静态字段,则不会初始化子类。 对于静态字段,只会初始化直接定义该字段的类,因此在子类中引用父类中定义的静态字段只会触发父类的初始化,而不会触发子类的初始化。

使用数组定义引用类不会触发类的初始化。

常量在编译阶段存储在调用类的常量池中,本质上不直接引用定义常量的类,因此不会触发定义常量的类的初始化。

4、使用

(略)。

5、卸载

在以下情况下,类将被卸载:

类的所有实例都已经回收。 这意味着java堆中不存在类的实例。 加载此类的ClassLoader已被回收。

类对应的java.lang.Class对象无处引用,无法从任何位置通过反射访问类的方法。

如果满足以上三个条件,jvm将在方法区域的垃圾回收过程中卸载类。 类的卸载过程实际上通过在方法区域清空类信息来终止java类的整个生命周期。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。