java中的类加载器做用:将java类的字节码加载到java虚拟机(JVM)中。java
bootstrap:虚拟机的内置类加载器(称为 "bootstrap class loader")自己没有父类加载器,可是能够将它用做 ClassLoader 实例的父类加载器,也就是类加载器的父类加载器。
bootstrap
ExtClassLoader:负责记载G:\Java\jdk1.6.0\jre\lib\ext\*.jar下的类。(这里的路径是我安装jdk的路径)。数组
AppClassLoader:负责加载classpath路径下的类。安全
自定义类加载器:(自定义加载路径)app
class 类名 extends ClassLoader { public Class findClass(String name) { byte[] b = loadClassData(name); //经过字节码数组转换为Class类实例 return defineClass(name, b, 0, b.length); } //获取字节码数组(自定义的) private byte[] loadClassData(String name) { } }
自定义的类加载器能够将java代码混淆,也就是编译源码的时候先经过本身定义的加密规则编译,而后类加载器加载类的时候按照解密规则加载,这样能够增长代码的安全性,可是加载效率下降了。
加密
类加载器使用委托机制加载类的,每一个 ClassLoader 实例都有一个相关的父类加载器。须要查找类或资源时,ClassLoader 实例会在试图亲自查找类或资源以前,将搜索类或资源的任务委托给其父类加载器。个人理解是这样的:假如咱们要加载一个类,那么咱们是否是应该先加载一个类加载器呢?而咱们类加载器的加载是否是也须要一个类加载器去加载它,才会建立一个他的实例去供java虚拟机调用并加载其余的类,因此加载一个类的时候是从bootstrap——>extclassload——>appclassloader——>自定义类加载器,从上往下开始去加载这个类的,若是类加载器找到了就会返回这个类的实例,没有找到就会交给他的下一级去找。(注意:类加载的发起者不会交由它的子类去加载。假如是从appclassloader发起的,那么若是在appclassloader类加载器尚未找到这个类的,那么就会抛出找不到类的异常,而不会再交给它的子类去加载这个类)。spa