Имеет ли «+» в имени аннотации какое-то особое значение? - PullRequest
19 голосов
/ 17 мая 2019

Я просматривал байт-код файла .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 Ответ

13 голосов
/ 17 мая 2019

Я не думаю, что это имеет какое-то особое значение. Это системная аннотация, связанная с 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);
...