Java 检查调用方法是否已注释

Java 检查调用方法是否已注释,java,reflection,annotations,Java,Reflection,Annotations,我有一个用例,被调用方方法的返回行为应该根据调用方方法的注释而改变 情况如下: @SomeAnnotation public void caller(){ return SomeOtherClass.caller(String arg); } // Returns X in this case public class SomeOtherClass{ public String callee(String arg){ if(annotationIsPrese

我有一个用例,被调用方方法的返回行为应该根据调用方方法的注释而改变

情况如下:

@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";
    }
}
我查阅了一些资料,发现了

我正在考虑使用来获取当前的invoker方法

我不知道这是可行的还是正确的设计。有人能评论一下吗

添加代码:

注释

@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;
    }
}

你找到了一些资源-你尝试了吗?我正在尝试。我需要关于设计方法的建议。这是正确的组合方式吗?可能重复:问题的不同之处在于我不知道调用方方法的类的名称。另外,调用方方法的名称可能是什么。我真的建议不要这样做。是的,您可以查看stacktrace(这是一个很慢的btw)并找到调用者,它将工作。。。直到您在不太传统的JVM上运行它,或者发生某种JIT优化,并且跟踪不再存在。更好的做法是为该调用方提供不同配置或不同的代码实例。您找到了一些资源-您尝试了吗?我正在尝试。我需要关于设计方法的建议。这是正确的组合方式吗?可能重复:问题的不同之处在于我不知道调用方方法的类的名称。另外,调用方方法的名称可能是什么。我真的建议不要这样做。是的,您可以查看stacktrace(这是一个很慢的btw)并找到调用者,它将工作。。。直到您在不太传统的JVM上运行它,或者发生某种JIT优化,并且跟踪不再存在。相反,为该调用方提供不同配置的或不同的代码实例会更好。
public class Main {

    public static void main(String[] args){
        Caller.caller();
    }
}