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

时间:2014-01-29 10:18:00

标签: java annotations classloader urlclassloader

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

@Foo
public class A { ... } 

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

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

显然,我无法更改Java Runtime,但是有一种方法可以让URLClassLoader声明要由它加载的类(但是保持脏工作在父级上 - 并让他注册该类以便我可以通用通用父实例来实现它吗?

1 个答案:

答案 0 :(得分:0)

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

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