系统的类加载器

Posted 四猿外

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统的类加载器相关的知识,希望对你有一定的参考价值。

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java 虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class 文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。

这里所指的“相等”,包括代表类的Class 对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回结果,也包括使用instanceof 关键字做对象所属关系判定等情况。

在自定义ClassLoader 的子类时候,我们常见的会有两种做法,一种是重写loadClass 方法,另一种是重写findClass 方法。其实这两种方法本质上差不多,毕竟loadClass 也会调用findClass,但是从逻辑上讲我们最好不要直接修改loadClass 的内部逻辑。我建议的做法是只在findClass 里重写自定义类的加载方法。

loadClass 这个方法是实现双亲委托模型逻辑的地方,擅自修改这个方法会导致模型被破坏,容易造成问题。因此我们最好是在双亲委托模型框架内进行小范围的改动,不破坏原有的稳定结构。同时,也避免了自己重写loadClass 方法的过程中必须写双亲委托的重复代码,从代码的复用性来看,不直接修改这个方法始终是比较好的选择。

以上是关于系统的类加载器的主要内容,如果未能解决你的问题,请参考以下文章

Java-类加载器

[Java安全]类加载器ClassLoader

[Java安全]类加载器ClassLoader

深入理解JVM(③)虚拟机的类加载器(双亲委派模型)

从源码的角度,来解释Tomcat为什么要实现自己的类加载器打破双亲委派模型?

[Java安全]类加载器ClassLoader