1

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

@Foo
public class A { ... } 

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

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

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

4

1 回答 1

0

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

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

于 2014-01-29T15:55:38.040 回答