为了账号安全,请及时绑定邮箱和手机立即绑定

注释名称中的“+”是否有特殊含义?

注释名称中的“+”是否有特殊含义?

慕工程0101907 2022-11-30 16:18:49
我正在查看Checker Framework提供的中央 Maven 存储库中自定义注释 jdk-8的 .jar 文件的字节码。在那里我注意到Object.class和Class.class文件中有一些无效的 Java 代码。当我在 Eclipse 中加载 jar 时,它是一个具有以下语法的注释:@jdk.Profile+Annotation(value=(int) 1) public class java.lang.Object {现在,据我所知,这个注释名称是无效的 Java。但是,我假设它可能对编译器有意义(类似于编译器分配给匿名类的名称)。我不确定是什么,在网上搜索时也找不到任何相关信息。因此,查询。任何帮助表示赞赏。
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

我不认为它有什么特别的意义。这是一个与JEP 161相关的系统注释,它添加了附加的“配置文件”,以便您可以在 JRE 的子集上运行应用程序。它以编程方式添加,因此不需要遵守语法规则。

在 OpenJDK 错误跟踪器中搜索此 JEP ,发现添加了“合成”注释的提交

看起来好像已经为 a 建立了先例sun.Proprietary+Annotation,他们只是遵循惯例。

我怀疑 Sun 注释以这种方式命名的原因已经消失在时间的编年史中——它早于 Java 6,在代码开源之前。

我还发现了对 jdeps 的提交,他们在其中解析这些注释,而它们并不重视它们的命名方式;他们只是为两者使用完全限定的名称。


您也可以开始使用非法类型标识符——无需在 Oracle 工作!

final DynamicType.Unloaded<? extends Annotation> unloaded = new ByteBuddy()

    .with(TypeValidation.DISABLED)

    .makeAnnotation()

    .name("jdk.Profile+Annotation")

    .make();


final DynamicType.Loaded<? extends Annotation> loaded = unloaded.load(Test.class.getClassLoader());

final Class<? extends Annotation> myBadlyNamedAnnotation = loaded.getLoaded();


System.out.println(myBadlyNamedAnnotation);


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号