gpt4 book ai didi

java - 为什么 A.class.getClassLoader() 不返回 loader.loadClass ("A"使用的加载器)

转载 作者:行者123 更新时间:2023-11-29 04:25:54 25 4
gpt4 key购买 nike

在这个测试用例中,我们通过特定的类加载器实例加载类 A,即 GwClassLoader。但是,A.class.getClassLoader() 不检索该类加载器?这是测试用例:

class A{
static {
ClassLoader loader = A.class.getClassLoader();
System.out.println("A.<cinit>: " + loader);
}
}

class ClassLoaderGw extends ClassLoader { }

public class App {
public static void main(String [] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
ClassLoaderGw loader = new ClassLoaderGw();
System.out.println("Main: " + loader);
Class<?> klass = loader.loadClass("A");
Object obj = klass.newInstance();
}
}

并且,这是运行 App 类的输出:

Main: ClassLoaderGw@6d06d69c
A.<cinit>: sun.misc.Launcher$AppClassLoader@73d16e93

如何在 A 类的静态构造函数中获取 GwClassLoader 的实例?

最佳答案

ClassLoaderGw 只是扩展了 ClassLoader 而没有覆盖任何方法。因此,它将遵循标准 loadClass 方法 ( javadoc ) 的策略......即首先委托(delegate)给父类加载器。

在这种情况下,您的 A 类位于父类加载器的类路径中,因此 将加载它。

最后一 block 拼图是 getClassLoader() 返回实际加载类的类加载器,而不是您要求进行加载的类加载器。 p>


How can I get the instance of GwClassLoader inside the static constructor of the class A?

基本上,您不能...除非 GwClassloader 负责加载类 A

你能让它工作吗?好吧......如果你使用不同的类加载策略你可以。或许。如果 GwClassloader 能够找到 A 的字节码并调用 defineClass 本身,那么它将是 A 的类加载器>。

但是,您需要担心 A 类也可能被父类加载器加载的可能性。如果发生这种情况,您可能同时存在两种不同的 A 类型。这可能会导致在意想不到的地方出现类转换异常。

关于java - 为什么 A.class.getClassLoader() 不返回 loader.loadClass ("A"使用的加载器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46320150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com