java基础之类加载器
一个java应用程序可以使用两种类装载器: “启动”(bootstrap) 类装载器和用户自定义的类装载器。启动类装载器是java虚拟机自带的装载器,是其实现的一部分。该装载器通常使用默认方式从本地磁盘中装载类。
自定义类装载器可以用java编写,编译成class 文件后能被虚拟机装载,还能够像其他对象一样实例化。它们属于java应用程序可执行代码的一部分。
自java1.2 起,java 使用双亲委派模式来装载类。除启动类装载器外每个类装载器都有一个“双亲”类装载器,在某个特定的类装载器试图装载类型以前,会默认地将这个任务“委派”给它的双亲---请求他的双亲来装载这个类型。这个双亲再依次请求它自己的双亲来加载这个类,直到启动类装载器。如果一个类装载器的双亲类装载器有能力装载这个类,则这个类装载器返回这个类型,否则,这个类装载器试图自己装载。通过双亲委派可以防止恶意定义java API中的类,如 java.lang.Integer 。但不能解决定义相同包下的其他名称类。如java.lang.Virus;
这时就需要依赖运行时包,指由同一个类装载器装载的、属于同一个包的、多个类的集合。即要拥有包访问权限,必须满足两个条件,一、有一致命名空间。 二、是同一个类装载器装载。
class 文件检验器
在class 文件被加载前,class 文件检验器会对将加载的文件进行安全性及完整性检查。具体有如下四趟:
- class 文件结构检查。 检查class 文件是否完整,是否符合JAVA Class 文件的基本结构。如检查class 文件是否以魔数 0xcafebabe 开头,及声明的版本号是否合规等。
- 类型数据语义检查。检查类的每个部分,确认它们所属类型的实例,结构是否正确。如方法描述符是否符合特定的上下文无关文法。检查类是否有超类,final 类是否有子类等。
- 字节码检查。检查java字节流即类的方法。检查局部变量是否合法、操作数栈是否包含正确的数值及类型、类方法被调用时总是传递正确的数值和类型。
- 符号引用的验证。检查类中引用到的其他类是否存在等。