开发者社区 问答 正文

java中热加载的方式是通过创建一个新的classLoader实现的吗???

不同的classLoader加载class是隔离的,是通过不同的classLoader加载实现的吗?

展开
收起
magicalman 2021-10-25 11:02:55 463 分享 版权
阿里云 AI 助理回答

是的,不同的ClassLoader在Java中负责加载类,并且它们之间是隔离的。这意味着,如果两个类是由不同的ClassLoader加载的,即使这两个类的全限定名完全相同,JVM也会视为两个不同的类。这种机制对于实现应用程序的安全性、模块化和版本控制非常有用。

Java中的ClassLoader主要有以下几种:

  1. Bootstrap ClassLoader(启动类加载器):负责加载Java的核心库,如java.*包下的类。这个加载器是用C++编写的,是JVM的一部分,没有父加载器。

  2. Extension ClassLoader(扩展类加载器):负责加载JDK的扩展目录($JAVA_HOME/jre/lib/ext或由系统变量java.ext.dirs指定的目录)中的类库。它是由Bootstrap ClassLoader加载的,因此它的父加载器是Bootstrap ClassLoader。

  3. Application ClassLoader(系统类加载器/应用类加载器):负责加载用户类路径(ClassPath)上的类,是我们平时开发中默认使用的加载器。它是由Extension ClassLoader加载的,因此其父加载器是Extension ClassLoader。

除了上述三种基本的ClassLoader外,开发者还可以自定义ClassLoader(通过继承java.lang.ClassLoader类),以实现特定的类加载逻辑。自定义ClassLoader可以用来从网络、数据库或其他非标准位置加载类,或者实现特殊的安全策略、类加载缓存等。

当一个类需要被加载时,JVM会遵循双亲委派模型(Parent Delegation Model)来尝试加载这个类: - 首先,当前ClassLoader会将加载请求委托给其父加载器。 - 如果父加载器无法加载,则当前ClassLoader才会尝试自己加载。 - 这个过程会一直递归到Bootstrap ClassLoader,如果所有加载器都无法加载该类,则抛出ClassNotFoundException

这种隔离性和委派机制确保了类加载的稳定性和安全性,避免了类的重复加载,同时也支持了不同上下文环境下的类加载需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: