ClassLoader有多个子类:BootstrapClassLoader,ExtClassLoader,AppClassLoader等。
但是,我认为只有一个BootstrapClassLoader就足够了!
有人可以告诉我为什么有这么多不同类的ClassLoader?
注意:这就是为什么有这么多类的类加载器,而不是为什么有这么多的类加载器实例呢?
答案 0 :(得分:2)
每个类加载器都旨在从不同位置加载类。例如,您实际上可以创建一个类加载器,它将从联网服务器加载类文件或从远程Web服务器等下载类的二进制文件。执行此操作的逻辑被烘焙到类加载器本身并提供一致的接口,以便客户端可以加载类,无论类加载器如何实际执行加载。 BootstrapClassLoader能够从JVM_HOME / lib目录加载类......但是如果你需要从不同的位置加载它们呢?
简而言之,因为有很多种方法可以加载类,并且需要一个灵活的系统来允许开发人员按需要加载它们。
答案 1 :(得分:2)
如果你想要一个JVM,其中类文件不存在于文件系统中,原始加载器期望它们是什么?例如,您正在运行一个嵌入式环境,其中类文件字节代码位于ROM或原始USB记忆棒上。
如果您想通过网络(如小程序)获取字节码,会发生什么?
如果Oracle决定将类文件字节代码更好地存储在数据库表中,会发生什么情况(考虑到他们对Oracle DBMS 和 Java的所有权),这实际上是有意义的。
如果您只想从文件系统一次加载字节代码然后将内存映射到不同的进程以提高效率,该怎么办?
如果你想要加密的字节码,那么人们不能从磁盘上的文件中拆解,只有类加载器才能解密?是的,我知道没有任何东西可以使文件真正安全,这些方案的想法是简单地停止"休闲"饼干。我不希望它会使这种更严重的品种减速超过七秒钟: - )
不同的类加载器使您可以灵活地插入自己的方法来加载字节代码,包括那些从未想到过的字节代码,同时仍然允许回退到原始代码。