java - 注释名称中的 '+' 有什么特殊含义吗?

标签 java java-8 checker-framework

我正在查看 custom annotated jdk-8 的 .jar 文件的字节码在 central maven repositoryChecker Framework 提供.

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

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

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

感谢任何帮助。

最佳答案

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

Searching the OpenJDK bug tracker对于这个 JEP 出现了 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);

关于java - 注释名称中的 '+' 有什么特殊含义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56183011/

相关文章:

java - 从终端将项目添加到 java 构建路径

Java:条件运算符不同于 if/else

java - 使用 selenium 为 Firefox 设置代理身份验证

java - 将 Gradle 依赖项的路径传递给 Java 编译器

java - 格式化方法 : how to forward their arguments to another format method?

java - 如何从长字符串中取出特定字符串

java - 如何使用 FXML 在 JavaFX 中动态创建选项卡?

java - 如何获取List中多个最大值的索引

java - 匹配不同卡片的正则表达式模式

java - 使用 ErrorProne 强制执行类型注释?