我有一个用例,其中callee方法的返回行为应该根据调用方法的注释而改变。
情况如下:
@SomeAnnotation
public void caller(){
return SomeOtherClass.caller(String arg);
}
// Returns X in this case
public class SomeOtherClass{
public String callee(String arg){
if(annotationIsPresent(SomeAnnotation.class))
return "X";
else
return "Y";
}
}
我浏览了一些资源,发现this。
我在考虑使用Thread.currentThread().getStackTrace()
来获取当前的调用方法。
我不知道这是否可行或是否也是正确的设计。有人可以对此发表评论吗?
添加代码:
注释
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeAnnotation {
}
来电者班级
@SomeAnnotation
public class Caller {
@SomeAnnotation
public static void caller(){
System.out.println(new Callee().callee());
}
}
被叫方
public class Callee {
public String callee(){
String className = Thread.currentThread().getStackTrace()[2].getClassName();
String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
try {
Class<?> klass = Class.forName(className);
Method method = klass.getMethod(methodName);
if(klass.isAnnotationPresent(SomeAnnotation.class))
System.out.println("HELLO");
if(method.isAnnotationPresent(SomeAnnotation.class))
System.out.println("HELLOW");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
主要课程
public class Main {
public static void main(String[] args){
Caller.caller();
}
}