据我所知,java 无法检索方法内部的任何内容。所以我在 javac 中使用选项 -g 或 -g:vars。
例如:
class Test {
int a=0;
void method(boolean boo){
String b;
try
{
new Thread().sleep(1000);
}
catch(InterruptedException e){}
JOptionPane.showMessageDialog(null,"test");
BufferedImage image=ImageIO.read(new File("C:\\file.png"));
}
}
所以,我使用 BCEL 来检索局部变量。
import org.apache.bcel.classfile.*;
import org.apache.bcel.Repository;
class javap
{
public static void main(String[]args)
{
try
{
JavaClass jc = Repository.lookupClass("test");
ConstantPool constantPool = jc.getConstantPool();
Method [] method=jc.getMethods();
for (Method m : method)
{
LocalVariableTable lvt=m.getLocalVariableTable();
LocalVariable[] lv=lvt.getLocalVariableTable();
for(LocalVariable l : lv)
{
System.out.println(l.getName()+" : "+l.getSignature());
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
但是如果变量没有像String b
. 此外,我想跟踪构造函数调用,如或new Thread()
以及new File()
调用静态方法,并在内部初始化,以及内部。所以我想在输出中看到, , ,和.JFileChooser
new File
JOptionPane
Thread
String b
JOptionPane
ImageIO
File
我应该怎么做才能使它们打印在我的程序中?