Начиная с Java 9, способ хранения работает для аннотаций, которые имеют цель LOCAL_VARIABLE, изменился. Теперь представление байт-кода будет содержать информацию о аннотированных локальных переменных в каждом методе. Кроме того, в спецификации указано, что If m has an element whose value is java.lang.annotation.RetentionPolicy.RUNTIME, the reflection libraries of the Java SE Platform must make a available at run time.
, что, если я правильно понимаю, подтверждает, что, по крайней мере, аннотации к локальным переменнымметод должен быть доступен через отражение.
Однако я пытался использовать отражение, чтобы найти аннотации (или аннотированные локальные переменные, или их значения) без удачи.
Следовательно, кто-нибудьесть подсказка как это сделать или возможно ли это? Я использую Java 11.
Например, это мой основной класс, в котором я пытаюсь получить аннотации @Parallel
из тестового метода.
public class Main {
public static void main(String[] args) {
try {
System.out.println("Main.class.getDeclaredMethod(\"test\").getAnnotations().length = " +
Main.class.getDeclaredMethod("test").getAnnotations().length);
System.out.println("Main.class.getDeclaredMethod(\"test\").getDeclaredAnnotations().length = " +
Main.class.getDeclaredMethod("test").getDeclaredAnnotations().length);
Annotation annotation = Main.class.getDeclaredMethod("test").getAnnotation(Parallel.class);
System.out.println("annotation = " + annotation);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
void test() {
@Parallel int a = 2;
@Parallel int b = 4;
}
}
И это моя аннотацияреализация. Я просто добавил все в качестве цели, так как я только проверяю это:
@Target({ ElementType.LOCAL_VARIABLE, ElementType.TYPE, ElementType.TYPE_USE, ElementType.TYPE_PARAMETER,
ElementType.FIELD, ElementType.PARAMETER, ElementType.PACKAGE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Parallel {
}
Запуск javap -l -v -c -s Main.class
покажет это:
void test();
descriptor: ()V
flags: (0x0000)
Code:
stack=1, locals=3, args_size=1
0: iconst_2
1: istore_1
2: iconst_4
3: istore_2
4: return
LineNumberTable:
line 22: 0
line 24: 2
line 25: 4
RuntimeVisibleTypeAnnotations:
0: #27(): LOCAL_VARIABLE, {start_pc=2, length=3, index=1}
Parallel
1: #27(): LOCAL_VARIABLE, {start_pc=4, length=1, index=2}
Parallel
Понятно, что информация об аннотациях налокальные переменные есть, я просто не знаю, может ли отражение получить его (или есть ли другой способ получить его во время выполнения)