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

2022-09-02 13:49:59

我正在查看 Checker Framework 提供的中央 maven 存储库自定义注释的 jdk-8 的 .jar 文件的字节码。

在那里,我注意到一些无效的Java代码和文件。当我在Eclipse中加载jar时,它是一个具有以下语法的注释:Object.classClass.class

@jdk.Profile+Annotation(value=(int) 1)
public class java.lang.Object {

现在,据我所知,这个注释名称是无效的Java。但是,我假设它对编译器来说可能意味着什么(类似于编译器分配给匿名类的名称)。我不确定是什么,我在网上搜索时也找不到任何关于它的信息。因此,查询。

任何帮助是值得赞赏的。


答案 1

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

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

看起来这个先例已经为论坛确立了,他们只是遵循了惯例。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);

答案 2

推荐