代码之家  ›  专栏  ›  技术社区  ›  Steve

是否可以实例化给定类的Java注释?扩展注释>?

  •  5
  • Steve  · 技术社区  · 15 年前

    我有一个 Class<? extends Annotation> 试着打电话 newInstance() 但是Java对我大声喊叫,原因很明显,我不能实例化一个接口。但是我知道像easymock这样的框架完全能够实例化接口。一个完全愚蠢的人需要什么? Annotation 我的实例 Class ?

    4 回复  |  直到 8 年前
        1
  •  7
  •   Affe    15 年前

    模拟框架不实例化接口,它们构建在运行时动态实现接口的类。你可能会发现 this javadoc enlightening 为了你想做的!

        2
  •  7
  •   Steve    15 年前

    多亏了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.
        }
      });
    很有魅力。
        3
  •  2
  •   Edwin Buck    15 年前

    不能创建未完全指定的类的实例。

    举例说明,呼叫 newInstance() 关于一类类型 Class<Object> 肯定会创建一个对象,但调用 NeWestStand() 关于一类类型 Class<?> 会让编译器不知道它应该构造的整个可能性宇宙中的哪个类。

    只是因为您已经通过指定而不是 ? 你想要一个 ? 延伸的 Annotation 并不意味着您已经实际命名了要构造的特定类。 ? extends Annotation 意思是“某个类的扩展 注释 “如果不指定确切的类,类加载器就无法确定要调用哪个构造函数,因为没有限制可以扩展的类的数量。 注释 .

    EasyMock不实例化接口。我不熟悉框架,但它可能实例化了扩展所需接口的Java.Lang.Object(S),或者实例化了“类幕后”框架类,该类是用类定义中的“实现接口”子句生成的。接口没有默认构造函数。

        4
  •  0
  •   Dr. Hans-Peter Störr    8 年前

    如果您在编译时知道注释的类型,那么您可以创建一个实现注释的类,就像它是普通注释一样。也见 this answer .