不同的classLoader加载class是隔离的,是通过不同的classLoader加载实现的吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
是的,不同的ClassLoader在Java中负责加载类,并且它们之间是隔离的。这意味着,如果两个类是由不同的ClassLoader加载的,即使这两个类的全限定名完全相同,JVM也会视为两个不同的类。这种机制对于实现应用程序的安全性、模块化和版本控制非常有用。
Java中的ClassLoader主要有以下几种:
Bootstrap ClassLoader(启动类加载器):负责加载Java的核心库,如java.*
包下的类。这个加载器是用C++编写的,是JVM的一部分,没有父加载器。
Extension ClassLoader(扩展类加载器):负责加载JDK的扩展目录($JAVA_HOME/jre/lib/ext
或由系统变量java.ext.dirs
指定的目录)中的类库。它是由Bootstrap ClassLoader加载的,因此它的父加载器是Bootstrap ClassLoader。
Application ClassLoader(系统类加载器/应用类加载器):负责加载用户类路径(ClassPath)上的类,是我们平时开发中默认使用的加载器。它是由Extension ClassLoader加载的,因此其父加载器是Extension ClassLoader。
除了上述三种基本的ClassLoader外,开发者还可以自定义ClassLoader(通过继承java.lang.ClassLoader
类),以实现特定的类加载逻辑。自定义ClassLoader可以用来从网络、数据库或其他非标准位置加载类,或者实现特殊的安全策略、类加载缓存等。
当一个类需要被加载时,JVM会遵循双亲委派模型(Parent Delegation Model)来尝试加载这个类: - 首先,当前ClassLoader会将加载请求委托给其父加载器。 - 如果父加载器无法加载,则当前ClassLoader才会尝试自己加载。 - 这个过程会一直递归到Bootstrap ClassLoader,如果所有加载器都无法加载该类,则抛出ClassNotFoundException
。
这种隔离性和委派机制确保了类加载的稳定性和安全性,避免了类的重复加载,同时也支持了不同上下文环境下的类加载需求。