sun.reflect.Reflection.getCallerClass alternative

2022-09-03 15:45:06

如何使用堆栈跟踪或反射找到方法的调用方?(因为我没有足够的声誉来评论本身)

既然 sun.reflect.Reflection.getCallerClass 在 jdk8 中已被删除,那么还有什么替代方案呢?

如何使用 sun.misc.SharedSecrets

    JavaLangAccess access = SharedSecrets.getJavaLangAccess();
    Throwable throwable = new Throwable();
    int depth = access.getStackTraceDepth(throwable);
    StackTraceElement frame = access.getStackTraceElement(throwable, depth);

答案 1

如上面的评论中所述。我得出的结论是在短期内使用上面解释的,但作为长期解决方案,完全消除了对包的依赖。SharedSecrets.getJavaLangAccess()sun.*

基本上,我正在改变我的需求本身,以便它不需要功能。getCallerClass


答案 2

I 哈瓦代码

String callerClass = sun.reflect.Reflection.getCallerClass().getName()

在我的项目中,当我将jdk更改为1.8时,代码会抛出异常:

Exception in thread "main" java.lang.InternalError: CallerSensitive annotation expected at frame 1

有两种方法可以替换Reflection.getCallerClass()

 StackTraceElement[] elements = new Throwable().getStackTrace();
    String  callerClass = elements[1].getClassName();

StackTraceElement[] elements = Thread.currentThread().getStackTrace()
    String  callerClass = elements[1].getClassName();

祝你好运


推荐