原创

Java注解@CallerSensitive含义

现象

Java JDK9中调用Reflection类的native方法public static native Class<?> getCallerClass();时需要加上@CallerSensitive注解

权限限制

Reflection.getCallerClass()方法调用者必须有Bootstrap ClassLoader或者Extention ClassLoader类加载器加载权限,而我们代码Appclass Loader也称为SystemAppClass类加载器加载的,所以我们无法调用次方法。

功能

Reflection.getCallerClass()方法调用所在的方法必须用@CallerSensitive进行注解,通过此方法获取class时会跳过链路上所有的有@CallerSensitive注解的方法的类,直到遇到第一个未使用该注解的类,避免了用Reflection.getCallerClass(int n) 这个过时方法来自己做判断

验证:
file

写一个jdk动态代理测试代码,然后断点在java.lang.Class#forNameforName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException(这个方法有@CallerSensitive注解),然后手动执行Reflection.getCallerClass()Reflection.getCallerClass(1) 方法,发现两者的结果是不一样的,而Reflection.getCallerClass()结果与Reflection.getCallerClass(1)的结果是不一样 ,说明前者跳过了当前调用者java.lang.Class,找到了最上层没有@CallerSensitive注解的调用者。

作用

防止多层级反射做提升权限,跳过安全权限。如双重反射来提升权限,原理是当时反射只检查固定深度的调用者的类,看它有没有特权。说是这么说,实际开发也不知道有啥用,知道的可以交流下。

正文到此结束
本文目录