是否可以在给定Class ?
我有一个Class
Class
并尝试调用newInstance()
但是Java因为我无法实例化接口的明显原因而对我大吼大叫。 但我知道像EasyMock这样的框架完全能够实例化接口。 从我的Class
获取一个完全愚蠢的Annotation
实例需要什么?
模拟框架不实例化接口,它们构建在运行时即时实现它们的类。 你可能会发现这个javadoc很有启发性 ,你想做什么!
感谢Affe指出了我正确的方向 – 我会评论他的回答,但后来我无法格式化解决方案:
注释注释=(注释)Proxy.newProxyInstance( clazz.getClassLoader() new Class [] {Annotation.class}, new InvocationHandler(){ @Override public Object invoke(Object proxy,Method method,Object [] args){ 返回clazz; //应该只调用getClass()或annotationType()。 } });
奇迹般有效。
您无法创建未完全指定的类的实例。
为了说明,在Class
类型上调用newInstance()
肯定会创建一个Object,但是在Class>
上调用newInstance()
会让编译器想知道整个可能性范围内的哪个类它应该构建。
只是因为你通过指定而不是仅仅缩小了字段而缩小了一点?
,你想要一个?
扩展Annotation
并不意味着你实际上已经命名了一个特定的类来构造。 ? extends Annotation
? extends Annotation
只是意味着“一些扩展Annotation
类”而没有命名确切的类,ClassLoader无法确定要调用哪个构造函数,因为对可能扩展Annotation
的类数没有限制。
EasyMock不实例化接口。 我不熟悉该框架,但它可能实例化扩展所需接口的java.lang.Object,或者它实例化某种“幕后”框架类,该框架类是使用“implements interface”子句生成的在类定义中。 接口没有默认构造函数。
如果您在编译时知道注释的类型,则可以创建一个实现注释的类,就像它是一个普通的注释一样。 另见这个答案 。