Java 9+无法获取方法的局部变量的注释

问题描述 投票:2回答:1

自Java 9起,保留方式已用于将目标LOCAL_VARIABLE作为目标的注释的工作方式已更改。 Now the bytecode representation will hold information about annotated local variables in each method.此外,该规范还指出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。

作为示例,这是我的Main类,在这里我尝试从测试方法中获取@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

很明显,这里有关于局部变量注释的信息,我只是不知道反射是否能够检索它(或者是否还有其他方法可以在运行时获取它)

java reflection annotations
1个回答
2
投票

.class文件包含的信息多于通过反射公开的信息,但是反射不会公开有关方法内局部变量的信息。

我还没有找到正式声明的地方,但是可以指向java.lang.reflect.Method的Javadoc,该Javadoc没有公开任何有关局部变量的方法。看看java.lang.reflect.Method的其余部分,没有什么比the reflection package更适合的了。

© www.soinside.com 2019 - 2024. All rights reserved.