识别 Apache 字节码工程库 (bcel) 中的局部变量数据类型
Identify Local variable data types in Apache Byte Code engineering library (bcel)
我正在使用 Apache bcel 库读取 java class 文件。它允许从 org.apache.bcel.classfile.Method.getLineNumberTable()
调用中识别给定方法的局部变量名称。
但细节不包括局部变量的数据类型相关的细节。并且也找不到任何其他获取变量数据类型的方法。不胜感激
其实是有办法的。我们可以通过迭代method.getLocalVariableTable().getLocalVariableTable()
得到局部变量签名。一旦我们有了签名,就有一个名为 org.apache.bcel.classfile.Utility
的 Utility class 和一个转换方法 Utility.signatureToString(variableSignature)
.
实用程序的 Javadoc class - https://commons.apache.org/proper/commonsbcel/apidocs/org/apache/bcel/classfile/Utility.html
发布示例代码段
这是示例 java 文件,class 文件将用于分析
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());
}
}
这些是输出结果
- 整数输入
- int 整数值
- 字符串字符串值
- 布尔布尔值
- int[] intArray
我正在使用 Apache bcel 库读取 java class 文件。它允许从 org.apache.bcel.classfile.Method.getLineNumberTable()
调用中识别给定方法的局部变量名称。
但细节不包括局部变量的数据类型相关的细节。并且也找不到任何其他获取变量数据类型的方法。不胜感激
其实是有办法的。我们可以通过迭代method.getLocalVariableTable().getLocalVariableTable()
得到局部变量签名。一旦我们有了签名,就有一个名为 org.apache.bcel.classfile.Utility
的 Utility class 和一个转换方法 Utility.signatureToString(variableSignature)
.
实用程序的 Javadoc class - https://commons.apache.org/proper/commonsbcel/apidocs/org/apache/bcel/classfile/Utility.html
发布示例代码段
这是示例 java 文件,class 文件将用于分析
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());
}
}
这些是输出结果
- 整数输入
- int 整数值
- 字符串字符串值
- 布尔布尔值
- int[] intArray