Имеет ли "+" в имени аннотации какое-то особое значение?

Я просматривал байт-код файла .jar пользовательского аннотированного jdk-8 в центральном репозитории maven, предоставленном Checker Framework.

Там я заметил недопустимый код Java в Object.class и Class.class. Когда я загрузил банку в Eclipse, это была аннотация со следующим синтаксисом:

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

Теперь, насколько мне известно, это имя аннотации является недействительным Java. Но я предполагаю, что это может что-то значить для компилятора (аналогично именам, которые компилятор присваивает анонимным классам). Я не уверен, что и я не мог найти что-нибудь об этом при поиске в Интернете. Отсюда и запрос.

Любая помощь приветствуется.

Ответ 1

Я не думаю, что это имеет какое-то особое значение. Это системная аннотация, связанная с JEP 161, в которой добавлены аддитивные "профили", так что вы можете запустить приложение в подмножестве JRE. Он добавляется программно, поэтому он не должен придерживаться правил грамматики.

Поиск в трекере ошибок OpenJDK для этого 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);