识别Apache字节代码工程库(bcel)中的本地变量数据类型

时间:2017-02-26 22:19:08

标签: java bcel

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

但细节不包括局部变量的数据类型相关细节。而且也找不到任何其他获取变量daat类型的方法。很少得到赞赏

1 个答案:

答案 0 :(得分:2)

实际上还有一种方法。我们可以通过迭代method.getLocalVariableTable().getLocalVariableTable()来获取局部变量签名。获得签名后,会有一个名为org.apache.bcel.classfile.Utility的实用工具类,并且存在转换方法Utility.signatureToString(variableSignature)

Utility类的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. int input
  2. int intVal
  3. String stringVal
  4. boolean booleanVal
  5. int [] intArray