[英]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.