类加载

类加载机制

类加载过程: 加载->验证->准备->解析->初始化->使用->卸载

加载:将字节流的静态存储结构转化为方法区运行时数据结构,,生成一个对象,作为方法区类的各个数据访问入口

验证:确保class文件的字节流中包含的信息符合当前jvm的要求,且不会危害jvm的安全 需要有文件格式验证(版本号,文件格式开头,常量合理性验证等), 元数据验证(是否存在父类,且父类继承链是否正确), 字节码验证(对数据流和控制流进行分析,确定程序语义是合法的,符合逻辑的), 符号引用验证(符号引用在解析阶段会发生,验证是为了确保符号引用能够转化为直接引用)

准备:给类变量分配内存并设置初始值,内存会在方法区中分配

解析:jvm将符号引用替换为直接引用的过程 解析动作主要针对类、接口及对应方法等

初始化:执行类中代码

虚拟机规范规定了有且只有 5 种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始): 1、遇到new,getstatic,putstatic,invokestatic字节码指令时,如果类没有进行过初始化,则需要先触发其初始化,例如:使用 new 实例化对象、读取或设置一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法

2、对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。

3、当初始化类的父类还没有进行过初始化,则需要先触发其父类的初始化

4、虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类), 虚拟机会先初始化这个主类。 5、(不懂)当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。

以上5种属于类的主动引用,其余称为被动引用

类加载器 类加载过程中加载的第一步(通过一个类的全限定名来获取描述此类的二进制字节流),这个动作的代码模块称为“类加载器”

类的唯一性:类本身和加载它的类加载器确立

即使两个类来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类也不相等。

双亲委派模式: 定义:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

启动(引用)类加载器是c++实现,拓展类加载器和系统类加载器是java实现

该模式的重要:双亲委派模型对于保证 Java 程序的稳定运作很重要,例如类 “java.lang.Object”,它存放在“ rt.jar” 之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此 Object 类在程序的各种类加载器环境中都是同一个类。

自定义类加载器 Java 默认 ClassLoader,只加载指定目录下的 class,如果需要动态加载类到内存,例如要从远程网络下来类的二进制,然后调用这个类中的方法实现我的业务逻辑,如此,就需要自定义 ClassLoader。

自定义类加载器分为两步:

继承 java.lang.ClassLoader 重写父类的 findClass() 方法

全部评论

相关推荐

06-26 19:47
中南大学 Java
悲,毕业了!这是个坏事儿啊!
爱睡觉的冰箱哥:《这是个好事啊》---峰哥浪走天涯
毕业后不工作的日子里我在...
点赞 评论 收藏
分享
今天投了小鹏,收到了AI面,大概会问哪些啊?
期末一定及格:总共4个部分,心理测评、行测、然后就是问岗位、对岗位的理解、过往遇到了哪些难点怎么解决,很简单,没有什么特别专业的问题,都是一些综合素质相关的
小鹏汽车AI面4人在聊
点赞 评论 收藏
分享
05-09 13:22
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务