java - 如何指定 class.getClassLoader() 返回哪个类加载器?

标签 java annotations classloader urlclassloader

我有一个项目,其中有一个通用部分和几个“特定于实现的”,通过包装器使用,其中使用 URLClassLoader(以公共(public)类加载器作为父级)加载实现。现在,有一个由@Foo注释的通用类A,它是特定于实现的。

@Foo
public class A { ... } 

A 首先通过特定于实现的代码加载,因此它以 URLClassLoader 开头,但它尝试在父级中加载 - 它可以加载该类,因为它是通用类(并且我需要能够在通用中实例化该类)代码,尽管我不需要访问注释)。

然后,该实现检查注释@Foo,但没有找到,因为 Java 运行时尝试通过 A.class.getClassLoader() 加载注释,而 A.class.getClassLoader() 不是通用的。

显然,我无法更改 Java 运行时,但是有没有办法让 URLClassLoader 声明要由它加载的类(但将脏工作保留在父级上 - 并且让他注册该类,以便我可以通过通用父级实例化它)?

最佳答案

看来这确实不可能(可能有充分的理由)。 class.getClassLoader()返回实际调用defineClass()的加载器,findLoadedClass()返回它定义的类。因此,我不能让该类在子加载器中定义,而仍然在父加载器中返回加载的类。

我已经通过在子加载器中加载类 A 来解决这种情况(不提供从父加载器访问的权限),并将该子加载器传递到我需要加载该类的任何地方,尽管它相当通用 - 当我加载时无论如何,通过反射它是有效的。

关于java - 如何指定 class.getClassLoader() 返回哪个类加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21428015/

相关文章:

java - 我们如何将 json 字符串加载到 extjs4 arraystore 中?

java - 从 XSD 生成 pojo 时删除 @XmlElement 注释

scala - 如何在 Scala 中访问宏注释中的泛型类型?

java - ClassLoader 可以用任何东西替换数组

java - Beanshell 不会加载我动态添加的 JDBC 驱动程序类?

java - 为什么 "return"在 Kotlin 中可以返回 "return"?

java - 从后台堆栈中删除特定 fragment

hibernate ,PostgreSQL : Column "x" is of type oid but expression is of type byte

java - 自定义 URLClassLoader 不使用自定义类路径

java - iphone - 检查 APNS 证书的有效性和过期时间