美文网首页
@CallerSensitive注解(随笔)

@CallerSensitive注解(随笔)

作者: 简楼 | 来源:发表于2021-04-15 19:22 被阅读0次

前言

在阅读Unsafe源码是,以下是Unsafe部分源码:

    @CallerSensitive
    public static Unsafe getUnsafe() {
        Class var0 = Reflection.getCallerClass();
        if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
            throw new SecurityException("Unsafe");
        } else {
            return theUnsafe;
        }
    }

我们可以看到,这个方法上有一个@CallerSensitive注解,所以今天我们就来了解下这个注解。

分析

查看源码,我们可以看到方法内部都调用了Reflection.getCallerClass(),这是一个native方法;
巧的是,这个方法也有@CallerSensitive注解,下面是这个方法的源码:

    @CallerSensitive
    public static native Class<?> getCallerClass();
解释

Caller:调用者,Sensitive:敏感的/易感知的,顾名思义,这是主要针对于方法调用者所做的一些控制;

然而实际上,@CallSensitive是JVM中专用的注解,在类加载过过程中是可以常常看到这个注解;

那么,需要什么权限才能调用这个方法?

  1. 由bootstrap class loader加载的类可以调用
  2. 由extension class loader加载的类可以调用

用户路径的类加载都是由 application class loader进行加载的,也就是用户自定义的类基本上是无法调用此方法的

作用

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

番外

据说注解是为了堵住漏洞用的,曾经有黑客通过构造双重反射来提升权限,原理是当时反射只检查固定深度的调用者的类,看它有没有特权;

当你尝试用反射调用Reflection.getCallerClass(),结果会抛出异常;

所以在我们日常开发中,可以说作用不大,了解就好了;
主要还是JDK底层控制权限的地方使用。

相关文章

  • @CallerSensitive注解(随笔)

    前言 在阅读Unsafe源码是,以下是Unsafe部分源码: 我们可以看到,这个方法上有一个@CallerSens...

  • CallerSensitive注解是什么鬼?

    https://www.jianshu.com/p/cec71079acdf4.3.5用@CallerSensit...

  • Java CallerSensitive

    CallerSensitive ensures correct caller of a method is ret...

  • 注解随笔

    参考:http://www.cnblogs.com/peida/archive/2013/04/24/303668...

  • @CallerSensitive一些理解

    JEP 176: Mechanical Checking of Caller-Sensitive Methods中...

  • Android Studio-好用的插件

    前言 工作随笔,方便记起 1.ButterKnife 注解生成器 2.GsonFormat Gson自动化 3.T...

  • 2018-03-10 Spring常见注解

    随笔中默认的包为com.demo默认接口:Demo实现类:Demo1,Demo2 使用spring注解第一步,需要...

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • 注解与反射

    注解 声明一个注解类型 元注解 在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之...

  • 1.8 Java 注解annotation

    1.1 注解声明 Java注解Annotation,有声明注解和元注解 元注解:Java提供的元注解,所谓元注解就...

网友评论

      本文标题:@CallerSensitive注解(随笔)

      本文链接:https://www.haomeiwen.com/subject/xsrjlltx.html