Java类的三种状态:
SOURCE 源码状态(静态)
CLASS 二进制字节码文件状态(静态)
RUNTIME 运行时状态(加载到JVM的状态)
运行时验证是否是类文件
magic number(魔数) 文件头
验证版本号(本地环境JDK1.8编译class,服务器JDK1.7)
Java类加载器:
1.Java类加载器基于三个机制:委托、可见性和单一性
委托机制:将加载一个类的请求交给父类加载器,如果父类加载器不能找到加载这个类,那么再由当前加载器加载.
可见性:子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类.
单一性:只加载一个类一次,由委托机制确保子类加载器不会再次加载父类加载器加载过的类.
2.什么是类加载器
类加载器是用来加载类文件的类.java源代码通过javac编译器编译成类文件,然后JVM执行类文件中的字节码来执行程序.有三种默认使用的类加载器:Bootstrap类加载器、Extension类加载器和System类加载器(Application类加载器).
Bootstrap类加载器:加载JRE/lib/rt.jar中的JDK类文件,它是所有类加载器的父加载器,没有任何父加载器.被称为初始类加载器.
Extension类加载器:现将加载类的请求委托给父加载器Bootstrap类加载器,如果没有成功加载的话,再从/jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下加载类.
System类加载器:(又叫做Application类加载器),从classpath环境变量中加载某些应用相关的类,classpath环境变量通常由-classpath环境变量或-cp命令行选项来定义,或者是JAR中的Manifest的classpath属性.Application类加载器是Extension类加载器的子加载器.
3.类加载器的工作原理
委托机制:假如需要加载一个类,首先加载这个类的请求由Application类加载器委托给它的父加载器Extension类加载器,然后在委托给Bootstrap类加载器.Bootstrap类加载会先在rt.jar中查看有没有这个类,如果没有这个类,则将请求返回到Extension类加载器,然后在/jre/lib/ext目录下查看有没有这个类,如果有将被Extension类加载器加载,则Application类加载器就不会再加载这个类.如果没有这个类,再由Application类加载器从classpath中寻找,classpath定义的是类文件的加载目录.
可见性机制:子类加载器可以看到父类加载器加载过的类,父类加载器则看不到子类加载器中的类,当一个类已经被Application类加载器加载过之后,再用其他加载器加载这个类就会报ClassNotFoundException异常.
单一性机制:父类加载器加载过的类不能被子类加载器加载第二次.