是否可以在给定Class <! - 的情况下实例化Java Annotation?扩展注释 - >?

时间:2010-05-07 04:53:35

标签: java reflection annotations

我有一个Class<? extends Annotation>并尝试调用newInstance()但是Java因为我无法实例化接口的明显原因而对我大吼大叫。但我知道像EasyMock这样的框架完全能够实例化接口。从我的Annotation中获取一个完全愚蠢的Class实例需要什么?

4 个答案:

答案 0 :(得分:7)

模拟框架不实例化接口,它们构建在运行时即时实现它们的类。你可以找到this javadoc enlightening来做你想做的事情!

答案 1 :(得分:7)

感谢Affe指出了正确的方向 - 我会评论他的回答,但后来我无法格式化解决方案:

Annotation annotation = (Annotation) Proxy.newProxyInstance(
  clazz.getClassLoader(),
  new Class[] { Annotation.class },
  new InvocationHandler() {
    @Override public Object invoke(Object proxy, Method method, Object[] args) {
      return clazz; // only getClass() or annotationType() should be called.
    }
  });
就像一个魅力。

答案 2 :(得分:2)

您无法创建未完全指定的类的实例。

为了说明,在类型为newInstance()的类上调用Class<Object>肯定会创建一个Object,但在类型为newInstance()的类上调用Class<?>会让编译器感到疑惑它应该构建的整个可能性范围中的哪一类。

仅仅因为您通过指定而不只是?缩小了字段,您希望扩展?的{​​{1}}并不意味着您实际上已将其命名为要构建的特殊类。 Annotation只是意味着“扩展? extends Annotation的某个类”而没有命名确切的类,ClassLoader无法确定要调用的构造函数,因为对可能扩展的类的数量没有限制{{1 }}

EasyMock不会实例化接口。我不熟悉该框架,但它可能实例化扩展所需接口的java.lang.Object,或者它实例化某种“幕后”框架类,该类是使用“implements interface”子句生成的在类定义中。接口没有默认构造函数。

答案 3 :(得分:0)

如果您在编译时知道注释的类型,则可以创建一个实现注释的类,就像它是一个普通的注释一样。另请参阅this answer