Java - 定义和访问注释?

标签 java annotations

我有一个名为 Client 的抽象类。我怎样才能访问在子类的调用方法上声明的注释?处理此问题的最佳方法是什么?

public abstract class Client {

   protected void synchronize() {

      // How can I get the Annotation defined on inheriting class?   
      StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
      StackTraceElement lastStackElement =       stackTraceElements[stackTraceElements.length-1] ;
      Method m = this.getClass().getMethod(lastStackElement.getMethodName(),       String.class, int.class);
      m.getAnnotation(Cache.class);

      // synchronize data from server
   }

}

.

public class OrderClient extends Client {

   @Cache(minute = 5)
   public void synchronizrWithCustomerId(String customerId) {

      // So some stuff setup body and header

      super.synchronize();
   }

}

最佳答案

根据您的示例,此代码运行良好:

public class TestS1 {

    public abstract class Client {

        protected void synchronize() throws NoSuchMethodException {
            // How can I get the Annotation defined on inheriting class?
            StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
            StackTraceElement lastStackElement = stackTraceElements[2];

//注意这里:stackTraceElements[2]

     Method m = this.getClass().getMethod(lastStackElement.getMethodName(), String.class);
            Cache annotation = m.getAnnotation(Cache.class);
            System.out.println("Cache.minute = " + annotation.minute());
            // synchronize data from server
        }
    }

你还需要用@Retention(RetentionPolicy.RUNTIME)标记你的注释

    @Retention(RetentionPolicy.RUNTIME)
    @interface Cache {
        int minute();
    }

    public class OrderClient extends Client {
        @Cache(minute = 5)
        public void synchronizrWithCustomerId(String customerId) throws NoSuchMethodException {
            // So some stuff setup body and header
            super.synchronize();
        }
    }

    public void doTest() throws NoSuchMethodException {
        OrderClient oc = new OrderClient();
        oc.synchronizrWithCustomerId("blabla");
    }

    public static void main(String[] args) throws NoSuchMethodException {
        TestS1 t = new TestS1();
        t.doTest();
    }

}

输出是:Cache.minute = 5

关于Java - 定义和访问注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14050609/

相关文章:

java - 未在PreparedStatement上设置java.sqlite setObject

java - Maven Java GAE编译错误

java - CheckSum 8 异或错误结果

java - 带注释的 field.setInt() - java

java - 使用带注释的复合主键进行元素映射

java - 使用将 @Target 设置为 TYPE 的注释

java - JUnit 和 Contiperf : Properties file to dynamically create contiperf annotation values

java - 具有不同大小图像的 JToolBar 按钮 - NetBeans

java - 如何使用 Jackson 反序列化为基于 JSON 的列表或值?

jpa - JPA @Entity 注解的确切含义是什么?