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

hel*_*lix 19 java java-8 checker-framework

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

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

@jdk.Profile+Annotation(value=(int) 1)
public class java.lang.Object {
Run Code Online (Sandbox Code Playgroud)

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

任何帮助表示赞赏。

Mic*_*ael 13

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

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

似乎已经为a建立了先例,sun.Proprietary+Annotation并且它们只是遵循了约定。

我怀疑Sun注释以这种方式命名的原因已经被时间所遗忘了-它早于Java 6,而代码是开源的。

我还找到了对jdeps的提交,其中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);
Run Code Online (Sandbox Code Playgroud)

  • 难过,有点。我希望从用户的角度来看这会在javap反编译器中产生一些奇怪的效果……仍然是非常出色的侦探工作! (2认同)