【发布时间】:2015-06-23 05:22:13
【问题描述】:
据我所知,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。
我应该怎么做才能让它们打印在我的程序中?
【问题讨论】:
-
"但如果变量未初始化或构造函数调用未在变量中命名,则它不起作用。" - 我知道英语不是你的第一语言,但我真的不明白你在这里想说什么。你能改写一下,这样你在说什么就更清楚了吗?
标签: java methods constructor local-variables bcel