1

我正在使用 Apache bcel 库来读取 java 类文件。org.apache.bcel.classfile.Method.getLineNumberTable()它允许从调用中识别给定方法的局部变量名称。

但细节不包括局部变量的数据类型相关细节。并且也找不到任何其他获取变量 daat 类型的方法。一点帮助将不胜感激

4

1 回答 1

2

其实是有办法的。我们可以通过迭代得到局部变量签名method.getLocalVariableTable().getLocalVariableTable()。一旦我们有了签名,就会有一个 Utility 类被调用org.apache.bcel.classfile.Utility,并且有一个转换方法Utility.signatureToString(variableSignature)

实用程序类的 Javadoc - https://commons.apache.org/proper/commonsbcel/apidocs/org/apache/bcel/classfile/Utility.html

发布示例代码段

这是类文件将用于分析的示例 java 文件

public class ExampleClassFile {
    public void testClass(int input){
        int intVal= 0;
        String stringVal= "randomText";
        boolean booleanVal= false;
        int []intArray = new int[2];
    }
}

这是分析上述.class文件的bcel代码

JavaClass javaClass = Repository.lookupClass("ExampleClassFile");
for(Method method: javaClass.getMethods()){
    for(LocalVariable localVariable: method.getLocalVariableTable().getLocalVariableTable()){
        System.out.println(Utility.signatureToString(localVariable.getSignature()) + " " + localVariable.getName());
    }
}

这些是输出结果

  1. 整数输入
  2. 整数整数值
  3. 字符串 stringVal
  4. boolean booleanVal
  5. 整数 [] 整数数组
于 2017-02-27T12:58:29.457 回答