我正在查看custom annotated jdk-8提供的central maven repository中Checker Framework的.jar文件的字节码。
我注意到Object.class
和Class.class
文件中有一些无效的Java代码。当我在Eclipse中加载jar时,它是带有以下语法的注释:
@jdk.Profile+Annotation(value=(int) 1)
public class java.lang.Object {
据我所知,此注释名称是无效的Java。但是,我假设这可能对编译器有意义(类似于编译器分配给匿名类的名称)。我不确定是什么,也无法在网上搜索中找到任何有关它的信息。因此,查询。
感谢您的帮助。
答案 0 :(得分:13)
我认为它没有任何特殊含义。这是与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);