Java 9+ не может получить аннотации локальных переменных метода - PullRequest
2 голосов
/ 07 октября 2019

Начиная с 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

Понятно, что информация об аннотациях налокальные переменные есть, я просто не знаю, может ли отражение получить его (или есть ли другой способ получить его во время выполнения)

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Файл .class содержит больше информации, чем предоставляется посредством отражения, но отражение не предоставляет информацию о локальных переменных в методе.

Я не нашел, где это формально указано, но могу указатьв Javadoc для java.lang.reflect.Method, который не имеет методов, раскрывающих что-либо о локальных переменных. Глядя на остальную часть пакета отражения , нет ничего более подходящего, чем Method.

1 голос
/ 11 октября 2019

В конце концов мне удалось получить аннотации и информацию о них, используя низкоуровневую библиотеку обработки байт-кода ASM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...