【问题标题】:Java Annotations - Inherit annotations and RESTfulJava Annotations - 继承注解和 RESTful
【发布时间】:2015-09-09 13:15:20
【问题描述】:

基本问题

我想继承注解,这样我就可以声明抽象类,包括用于配置的注解。那么你只需要扩展这个抽象类并实现所有抽象方法,而不需要配置任何东西。

public class A {

}

@MyAnno
public class B extends A {
    public abstract void foo();
}

public class C extends B {
    public void foo() {
        Magic.bar();
    }
}

@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnno {

}

但是如果我检查反射,C 类没有用 MyAnno 注释。如果我将@MyAnno 添加到 C 类,它就可以工作。这对我来说似乎很奇怪。

球衣

除了我自己的注解之外,我还想使用@GET@Path(""where/I/am) 等Java RESTful Annotations。 This should work! 但是它没有,并且被注释的超类的子类没有任何 RESTful 注释或自己的注释,什么都没有。

【问题讨论】:

  • 您如何检查 C 类的注释? (我假设你并不是真的打算写class C extends C。)
  • new Reflections(MyServer.class.getPackage().getName()).getTypesAnnotatedWith(MyAnno.class) - 如果我注释子类本身,这将有效。 (Gradle:编译'org.reflections:reflections:0.9.10')
  • 我不知道那个库做了什么样的反射,只是简单地做MyAnno anno = C.class.getAnnotation(MyAnno.class)返回注释。去掉@Inherited就可以看到区别了,前面的代码会导致null
  • 您评论中的代码对我来说很好,返回CB。检查你的包裹。
  • 是的...阅读 javadocs 有时会让生活更轻松。 xD 对库有什么建议,以查询特定包中的所有带注释的类吗?

标签: java inheritance annotations jersey jax-rs


【解决方案1】:

反思

我使用的是org.reflections,如果这些超类不在类型搜索的包路径中,它不会输出带注释的超类的子类。

球衣

我在 2.9.x 未运行时使用过它。在 2.21 中运行良好!
更新:从已实现的方法中删除 @PathParam

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2011-11-02
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多