Reflection.getCallerClass()使用的问题

Honwhy
  • 7k

关于Java的问题,一般通过将堆栈作为关键词到搜索引擎搜索就有结果了。:)
这次遇到的问题有点意思,程序也很简单,所以就在提问下。
以下代码有什么问题呢?CallerSensitive annotation是什么意思?

import sun.reflect.Reflection;

public class CalleeApp {

    public void call() {
        Class<?> clazz = Reflection.getCallerClass();
        System.out.println("Hello " + clazz);
    }
}
public class CallerApp {

    public static void main(String[] args) {
        CalleeApp app = new CalleeApp();
        Caller1 c1 = new Caller1();
        c1.run(app);
    }

    static class Caller1 {
        void run(CalleeApp calleeApp) {
            if (calleeApp == null) {
                throw new IllegalArgumentException("callee can not be null");
            }
            calleeApp.call();
        }
    }

}

错误的堆栈

Exception in thread "main" java.lang.InternalError: CallerSensitive annotation expected at frame 1
    at sun.reflect.Reflection.getCallerClass(Native Method)
    at com.honey.caller.CalleeApp.call(CalleeApp.java:8)
    at com.honey.caller.CallerApp$Caller1.run(CallerApp.java:18)
    at com.honey.caller.CallerApp.main(CallerApp.java:8)

Java版本:

Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-8u141-b15-3-b15)
OpenJDK 64-Bit Server VM (build 25.141-b15, mixed mode)

UPDATE 2018年04月11日22:07:12
我觉得这篇文章是对这个问题的很好的解答,为什么不建议调用sun包,如何通过其他方法确定调用者

回复
阅读 8.8k
1 个回答
@Deprecated
/*     */   public static native Class<?> getCallerClass(int paramInt);

加上int型参数,
没用过这个方法,尝试一下
0:返回sun.reflect.Reflection
1:返回当前类的Class对象
2:返回调用该方法的Class对象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏