类加载机制深入剖析
1.类的加载
• 有两种类型的类加载器
– Java虚拟机自带的加载器
• 根类加载器(Bootstrap)<-【C++编写,无法获得】 • 扩展类加载器(Extension) • 系统类加载器(System)
– 用户自定义的类加载器 • java.lang.ClassLoader的子类 • 用户可以定制类的加载方式
类加载器并不需要等到某个类被“首次主动使用”时再加载它
JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误
,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)
LinkageError
的子类指示一个类在一定程度上依赖于另一个类;但是,在编译前一个类之后,后一个类发生了不相容的改变。
常常发生在Web开发中jar包的版本错误,一个jar包中的类引用另一个包中的类,当版本不一致就会发生这个错误
• 如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误
2.类的验证
• 类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。• 类的验证的内容【安全性考虑,可以手工构造2进制文件】
– 类文件的结构检查
– 语义检查
– 字节码验证
– 二进制兼容性的验证