1. 为什么研究类加载的全过程:
a) 有助于了解JVM运行过程。
b) 更深入理解JAVA动态性,了解类加载。
2. 核心:类加载器,当要加载类时(分为三步):
1、 加载:把字节码加入到内存中。
字节码--->类加载器--->类。
把字节码加入到方法区,形成一个运行的二进制数据结构,在堆中生成一个class对象。
2、 链接:
1. 验证:符合JVM规范,是否有安全问题。
2. 准备:正式为我们加载的类分配内存并且赋初始值。
3. 解析:虚拟常量池中符号引用改为直接引用(给予直接地址或者相对地址)。
3、 初始化:
1. 实现类构造器:编译器自动的收集类中的静态变量或者静态块,并且进行构造。
2. 初始化一个类时会初始化父类。
3. 保证在多线程构造时加锁。
4. 当访问一个类的静态域时只有真正声明这个域的类才能初始化。
1) 被动引用和主动引用:
2) 加载过程:
方法区、堆、栈,JVM加载类时,首先将类的信息加入到方法区中,JVM会自动收集类中的静态方法和静态块,在类加载过程JVM将类中相关方法变量加入到方法区。
一、 类加载器原理
类缓存区,已加载的类会在堆中存在一段时间,之后会被JVM垃圾回收机制回收。
二、 JAVA.LANG.CLASS.LOADER
JAVA中类加载的核心包。
三、 类加载器树状机制、双亲加载机制
1. 引导类加载器(bootstr class loader):
加载JAVA的核心库,采用的是原生代码(C),并不是采用继承JAVA的OBJECT类。
除引导类加载器是用C源生类写的,其余都是继承的JAVA的OBJECT包中。
1. 引导类加载器(bootstr class loader):
加载JAVA的核心库,采用的是原生代码(C),并不是采用继承JAVA的OBJECT类。
除引导类加载器是用C源生类写的,其余都是继承的JAVA的OBJECT包中。
2. 扩展类加载器(extendsions classloader):
双亲委托机制:
3. 应用程序类加载器(applicatio class loader):
根据用户给定的路径进行类的加载。
一、 自定义类加载器(文件、网络、加密)
文件加密
对需要加密的文件的字节进行处理。
实现思路:
1、 读取需要加密的文件。
2、 对读入数据进行操作。
3、 输出到目标文件中。
可以自定义加密的类加载器。
a) 继承java.lang.ClassLoader
b) 首先检查请求的类型是否已经被这个类装载器装载到命名空间中。如果已经装载,直接返回。
c) 委派类加载请求给父类加载器,如果父类加载器能够完成,则返回父类加载器加载的Class实例。
d) 调用本类加载器的findClass()方法,导入类型的方法区;如果获取不到对应的字节码或者其他原因失败,返回异常loadClass(),loadClass()转抛异常,终止加载过程。