简体   繁体   English

Java - 定义和访问注释?

[英]Java - Defining and accessing annotations?

I have an abstract class called Client. 我有一个名为Client的抽象类。 How can I get access to an annotation that was declared on the calling method on the child class? 如何访问在子类的调用方法上声明的注释? What's the best way to handle this? 处理这个问题的最佳方法是什么?

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();
   }

}

Based on your example this code works well: 基于您的示例,此代码运行良好:

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];

// take attention here: 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
        }
    }

also you need to mark your annotation with @Retention(RetentionPolicy.RUNTIME) 你还需要用@Retention(RetentionPolicy.RUNTIME)标记你的注释@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();
    }

}

Output is : Cache.minute = 5 输出为Cache.minute = 5

Andremoniy answer is absolutely correct. Andremoniy的回答绝对正确。 The only thing I changed was the way i lookup in the stack-trace. 我唯一改变的是我在堆栈跟踪中查找的方式。

    Cache cache = null;

    try {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

        for (StackTraceElement element : stackTraceElements) {
            if (this.getClass().getName().equals(element.getClassName())) {
                Method method = this.getClass().getMethod(element.getMethodName(), String.class);
                cache = method.getAnnotation(Cache.class);
                break;
            }
        }
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM