Reflection.getCallerClass()
Reflection的getCallerClass的使用:可以得到调用者的类
Reflection.getCallerClass()此方法的调用者必须有权限
- 由bootstrap class loader加载的类可以调用
- 由extension class loader加载的类可以调用
- 都知道用户路径的类加载都是由 application class loader进行加载的,换句话说就是用户自定义的一些类中无法调用此方法
Reflection.getCallerClass()方法调用所在的方法必须用@CallerSensitive进行注解,通过此方法获取class时会跳过链路上所有的有@CallerSensitive注解的方法的类,直到遇到第一个未使用该注解的类,避免了用Reflection.getCallerClass(int n)这个过时方法来自己做判断
@Deprecated //该方法已不建议使用
public static native Class<?> getCallerClass(int var0);
注意:从jdk 7u40开始,Oracle已经弃用了sun.reflect.package包里不易理解的Reflection.getCallerClass(int)方法。在Java 7中,通过设置Java命令行选项Djdk.reflect.allowGetCallerClass,可以继续使用该方法。但在Java 8及以后的版本中,该方法将被彻底删除,调用它会导致UnsupportedOperationException异常。
JDK 8中在getCallerClass方法加了 @sun.reflect.CallerSensitive 注解,该注解是提供给JVM底层读取处理的,提高了JDK实现感知调用者功能的安全性
根据Java文档,Reflection类位于调用栈中的0帧位置,该方法返回调用栈中从0帧开始的第x帧中的类。总之,getCallerClass方法提供的机制可用于确定调用者,从而实现“感知调用者(Caller Sensitive)”的行为,即根据调用类或调用栈中的其它类来调整其自身的行为
参考资料:
http://www.infoq.com/cn/news/2013/07/Oracle-Removes-getCallerClass