私が知っていることから、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
.
プログラムでそれらを印刷するにはどうすればよいですか?