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

Does '+' in an annotation name have some special meaning?

我正在查看 custom annotated jdk-8 in the central maven repository supplied by the Checker Framework.

的 .jar 文件的字节码

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

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

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

感谢任何帮助。

我觉得没有什么特别的意思。这是一个与 JEP 161 相关的系统注释,它添加了 "profiles" 添加剂,因此您可以 运行 JRE 子集上的应用程序。它以编程方式添加,因此不需要遵守语法规则。

Searching the OpenJDK bug tracker for this JEP turned up the commit where the "synthetic" annotation is added.

sun.Proprietary+Annotation好像已经有先例了,他们只是按照惯例而已。

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

我还发现 a commit to 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);