H5W3
当前位置:H5W3 > 其他技术问题 > 正文

JAVA为什么要有多个类加载器,1个不行吗

JAVA为什么要有多个加载器
我知道加载器作用是通过类名来获取二进制字节流。主要分为四种加载器,启动类->扩展类->应用类->自定义类。我也知道双亲委派机制的好处,就是越基础的类交给越高级的加载器加载。
我问题是只有一个加载器来加载全部的类不行吗,这样的话也就不存在什么不使用双亲委派机制的问题了
还是不懂

回答:

思考以下情景:

  1. 首先,是为了区分同名的类:假定存在一个应用服务器,上面部署着许多独立的应用,同时他们拥有许多同名却不同版本的类库。试想,这时候 jvm 该怎么加载这些类同时能尽可能的避免掉类加载时对同名类的差异检测呢?当然是不同的应用都拥有自己独立的类加载器了。
  2. 其次,是为了更方便的加强类的能力:类加载器可以在 load class 时对 class 进行重写和覆盖,在此期间就可以对类进行功能性的增强。比如添加面向切面编程时用到的动态代理,以及 debug 等原理。怎么样达到仅修改一个类库而不对其他类库产生影响的效果呢?一个比较方便的模式就是每个类库都可以使用独立的类加载器

小结:
jvm 需要有不同的类加载器,因为它一方面允许你在一个 jvm 里运行不同的应用程序,另一方面方便你独立的对不同类库进行运行时增强。

回答:

虽然 对java 虚拟机没有研究过,java 为什么不能 一个加载器 加载全部的类
很明显, 实现起来也可以
但是需要 的 代码 更多,也更难 为各种类进行 优化,为了更简单的抽象
我在明确知道 该类是启动类的情况下,我就会 为该类 进行优化。
如果是自定义类,可能就 不会进行 此类优化。
在明确 目的的情况下, 专用代码 比 通用代码 更简单,也更有效。

回答:

Each class loader is designed to load classes from different locations. For instance, you can actually create a class loader that will load a class file from a networked server or download the binary of a class from a remote web server, etc. The logic that performs this operation is baked into the class loader itself and provides a consistent interface so that clients can load classes regardless of how the class loader actually performs the loading. The BootstrapClassLoader is capable of loading classes from the JVM_HOME/lib directory…but what if you need to load them from a different location??

In short, because there as an infinite (well, not quite) number of ways to load classes and there needs to be a flexible system to allow developers to load them however they want.

每一个类加载器都是为了去在不同的情景下去加载类。比如,你可以从联网服务器上加载一个class文件,也可以从远程web服务器下载二进制类。这么设计是因为我们需要类加载器提供一致的接口,这样客户端就可以加载类但是却不用管类加载器到底是怎么实现的。启动类加载器能够加载JVM_HOME/lib 下的类,但如果我们需要在其他的情况下加载类呢?简单来说,加载类的方法有无数种,我们需要一个灵活的加载器系统去在特定的情况下按照我们的想法来加载类。

本文地址:H5W3 » JAVA为什么要有多个类加载器,1个不行吗

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址