当前位置: 首页 > 面试题库 >

sun.reflect.CallerSensitive注释是什么意思?

长孙兴德
2023-03-14
问题内容

@CallerSensitive以上方法的注释意味着什么?

例如,注释存在于Class的getClassLoader方法中

 @CallerSensitive
    public ClassLoader getClassLoader() {
    //
    }

问题答案:

根据我在评论中链接到的JEP(也在此处),

调用方敏感方法根据其直接调用方的类来改变其行为。它通过调用该sun.reflect.Reflection.getCallerClass方法来发现其调用者的类。

如果你看执行 Class#forName(String)

@CallerSensitive
public static Class<?> forName(String className)
            throws ClassNotFoundException {
    return forName0(className, true,
                    ClassLoader.getClassLoader(Reflection.getCallerClass()));
}

,您注意到它正在使用Reflection.getCallerClass()。如果我们看那种方法

返回调用此方法的方法的调用者的类,而忽略与之关联的框架java.lang.reflect.Method.invoke()及其实现。

@CallerSensitive
public static native Class getCallerClass();

在此JEP之前,似乎存在的问题是,如果通过反射而不是直接调用调用方敏感方法,则必须有一个复杂的过程来标识实际的调用类。如果通过反射调用该方法,则会出现问题。提出(并介绍了)一个更简单的过程@CallerSensitive

基本上,@CallerSensitive注释由JVM使用

JVM将跟踪此注释,并有选择地强制执行以下不变式:sun.reflect.Reflection.getCallerClass仅当该方法用此注释标记时,该方法才能报告该方法的调用者。



 类似资料:
  • 问题内容: : 程序元素类型。此枚举类型的常量为Java程序中声明的元素提供了简单的分类。这些常量与meta- annotation类型一起使用,以指定在何处使用注释类型是合法的。 有以下常量: ANNOTATION_TYPE- 注释类型声明 构造 函数-构造函数声明 FIELD- 字段声明(包括枚举常量) LOCAL_VARIABLE- 局部变量声明 方法 -方法声明 包装 -包裹声明 参数 -

  • 问题内容: 在搜索Python项目时,我发现有几行用注释。 在Python中是什么意思?它仅特定于Python吗? 问题答案: 添加到一行表明该linter(自动检查代码质量的程序)不应检查此行。代码可能已生成的任何警告都将被忽略。 该行可能对短绒棉“看起来不好”,但是由于某种原因,开发人员理解并希望它存在。 有关更多信息,请参见Flake8文档中的选择和忽略违规。

  • 问题内容: 我应何时在JPA中使用注释?此注释可以注释哪些数据类型? 问题答案: 表示带注释的字段在数据库中应表示为BLOB(二进制数据)。 您可以使用此注释来注释任何数据类型。在JPA中,持久(检索)后,将使用标准Java序列化对字段内容进行序列化(反序列化)。 的常用用法是在Entity内部注释一个字段,以存储一些未映射到DB列的对象属性。这样,所有未映射的值都可以以binarry表示形式存储

  • 问题内容: 我知道类注释的目的,这要归功于Java中注释的使用方式和位置?。如本博客文章和Java语言规范的第7.4.1节所述,包注释的目的是什么? 您为什么要将元数据与程序包关联?你能做些什么? 问题答案: bnd工具(和maven-bundle-plugin)利用包注释。将@Version和@Export批注放在package-info.java中,可以生成OSGi元数据。 javadoc使用

  • 问题内容: 我的问题是非常基本的,为什么我们人们使用注释,此注释的重要性是什么? 在旧的JDK中,为什么它不显示为警告,但是在最新的JDK中,则需要“为什么..”? 问题答案: 假设您有: 您 确实 打算覆盖,但是由于签名中的错误,它不是这样做的。如果使用,则可以让编译器检测故障。它 还会 向任何 阅读 代码的人表明这将覆盖现有方法或实现接口-为他们提供有关当前行为以及重命名该方法可能产生的影响的

  • 我正在开发一个使用 JPA 和Hibernate的项目,我刚刚注意到实体没有任何关系注释,例如@ManyToOne、@OneToOne等。所以我的问题是,JPA / Hibernate是否为每个案例添加了默认注释? 这里有一个例子 JPA是否默认在此属性中添加@OneTo的注释?