【问题标题】:Can I get information about the local variables using Java reflection?我可以使用 Java 反射获取有关局部变量的信息吗?
【发布时间】:2011-07-25 13:36:31
【问题描述】:

我需要知道局部变量的类型。我正在使用 Java 反射,使用它我无法获得它。请告诉我如何知道局部变量的类型/名称。

我可以使用 Java 反射获取有关局部变量的信息吗?

【问题讨论】:

标签: java reflection


【解决方案1】:

假设您谈论的是方法或构造函数的局部变量,您无法使用反射找到它们。你必须要么

  • 使用字节码库,例如 BCEL 或 ASM,或者
  • 使用远程调试器 API 之一。

后者将允许您访问局部变量的值,但只能在 JVM 被调试代理挂起时访问。

这两种方法都依赖于使用调试信息编译的相关类。具体来说,类需要用“局部变量调试信息”编译;例如使用javac -g ...。默认情况下不包含“vars”调试信息。

【讨论】:

    【解决方案2】:

    您可以使用ASM 等字节码逆向工程库访问局部变量映射。但是请注意,局部变量的名称可能并不总是存在于字节码中,但数量和类型将始终存在。

    无法通过反射获得此信息。反射在方法级别起作用,而局部变量在代码块级别。

    【讨论】:

    • 1 表示“局部变量在代码块级别”
    【解决方案3】:

    如果我的局部变量是指实例变量和类变量,你会这样做:

    String s = new String("This is a sample");
    Class<String> type = s.getClass();
    for ( Field f : type.getFields() ) {
        System.out.printf("Field %s is of type %s%n", f.getName(), f.getType().getName());
    }
    

    如果您的意思是方法/构造函数的局部变量,则您无法通过反射访问它们。

    【讨论】:

      【解决方案4】:

      不,Java 反射是不可能的。编译器通常会删除局部变量名称之类的东西,以提供一些混淆和优化空间。有字节码库ASM 它可以在运行时检查事物的状态,这可能对您有用。

      【讨论】:

        【解决方案5】:

        总之,你不能。编译器不会保留局部变量的名称。

        作为一个快速实验,我使用 Java 6 和默认编译器选项编译了以下类:

        public class X {
          public static void main(String[] args) {
            int var = 2;
            System.out.println(var);
          }
        }
        

        对生成的 .class 文件的快速检查表明,局部变量的名称 (var) 并没有出现。

        【讨论】:

        • 看我的回答。简而言之,如果您使用“-g”进行编译,则应该存在信息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多