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