JVM类加载器

java虚拟机中可以安装有多个类加载器,系统默认三个主要类加载器,分别是

BootStrapExtClassLoaderAPPClassLoader

每个类加载器负责加载特定位置的类,他们是一个树形结构,有些类加载器也是java类,也需要类加载器来加载,在实例化每个类加载器对象时,需要为其指定一个父级类加载器或默认采用系统类加载器。但总有第一个类加载器不是java类,而是初始化就有的,嵌套在jvm的核心中,这就是BootStrap

JVM类加载器_第1张图片



类加载器的委托机制:

 

java虚拟机要加载一个类时,到底由哪一个类加载器去加载呢?

首先当前线程的类加载器去加载线程中的第一个类,如果类A中引用了类Bjava虚拟机将使用加载类A的类加载器来加载类B还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

 

每个类加载器加载类时,又先委托给其上级类加载器。

当所有父类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,这时不会再继续向下去找发起者类加载器的下一级类加载器。

 

类加载器用到的设计模式:

每个类加载器都遵循了模板方法模式,这些类加载器加起来又构成了职责链模式。

模板方法是有个抽象类,抽象类中定义了多个抽象方法和一个叫做Template的规定按什么顺序调用这些抽象方法的一个方法,子类继承抽象类,子类重写多个抽象方法,子类可以有各自的实现。当调用子类的Template方法时,父类中预定义的顺序就起作用了。

当要加载一个.class时,发起者类加载器都先问父类是否能加载,如果不能继续往上询问父类,直到BootStrap,如果还不能,就往下回溯到发起者,发起者可能会加载到.class,这时就成功加载了所需要的类,发起者也可能加载不到.class,这时就报ClassNotFound的异常了。

 

自己写类加载器:

实现一个抽象方法:loadClassString name

在这个方法里,会先去找父类加载器,再去调用findClassString name

我们要保留loadClass方法,是为了保留里面的流程,就相当于模板方法里面的Template方法。

我们要做的就是重写findClassString name)方法,这是自己写的类加载器专门的自己干的代码。


你可能感兴趣的:(JVM类加载器)