是否可以在给定类<;的情况下实例化Java注释;?扩展注释>;?

是否可以在给定类<;的情况下实例化Java注释;?扩展注释>;?,java,reflection,annotations,Java,Reflection,Annotations,我有一个类您不能创建未完全指定的类的实例 举例来说,在类型为class的类上调用newInstance()肯定会创建一个对象,但在类型为class的类上调用newInstance()会让编译器不知道应该构造的整个可能性范围中的哪个类 仅仅因为您通过指定一个扩展注释的?而不是仅仅指定?,从而缩小了字段的范围,并不意味着您实际命名了要构造的特定类?extends Annotation只是指“扩展Annotation的某个类”,如果不指定确切的类,类加载器无法确定要调用哪个构造函数,因为可能扩展Ann

我有一个
类您不能创建未完全指定的类的实例

举例来说,在类型为
class
的类上调用
newInstance()
肯定会创建一个对象,但在类型为
class
的类上调用
newInstance()
会让编译器不知道应该构造的整个可能性范围中的哪个类

仅仅因为您通过指定一个扩展注释的
而不是仅仅指定
,从而缩小了字段的范围,并不意味着您实际命名了要构造的特定类<代码>?extends Annotation
只是指“扩展
Annotation
的某个类”,如果不指定确切的类,类加载器无法确定要调用哪个构造函数,因为可能扩展
Annotation
的类的数量没有限制


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

模拟框架不实例化接口,它们构建类,在运行时动态实现接口。你可以找到你想做的事

感谢Affe为我指明了正确的方向-我会对他的答案发表评论,但我无法格式化解决方案:

Annotation=(Annotation)Proxy.newProxyInstance(
clazz.getClassLoader(),
新类[]{Annotation.Class},
新的调用处理程序(){
@重写公共对象调用(对象代理、方法、对象[]参数){
return clazz;//只应调用getClass()或annotationType()。
}
});

工作起来很有魅力。

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

我相信EasyMock使用CGLIB。Mockito使用CGLIB。CGLIB是一个允许您创建代理对象的库。它比Java proxy更快,因为它创建/操作字节码。EasyMock似乎生成了一个名称类似于$Proxy0的类。$符号通常表示内部/生成的类名,根据EasyMock的内部体系结构,0可能是内部模拟类号。所以easy模式仍然创建一个类,而不是一个接口;然而,它创建了一个显然实现了接口的类。这个答案完全是胡说八道。JVM上有通配符类型,但它们从不表示具体类型。有吗?-指针总是指一个具体的类型。我不知道这个坏掉的注释实例能给你带来什么好处。就像我要了一个汉堡,却得到了一张火腿三明治的黑白照片的复印件。解释?我正在使用处理绑定注释的Guice代码。除了
@Named
,只有
annotationType()
getClass()
在传递给我调用的方法的
注释上被调用。因此,只要我的
注释
能够模仿这些方法,它就可以正常工作。@Steve
getClass()
不会传递给
InvocationHandler
并返回
Proxy.class
。但是您可能希望调试器使用
toString()