关于未使用的局部变量的检索:我运行了您的代码,发现
我有一个简单的代码示例:
class Test {
void method(boolean boo){
String b;
int a=0;
try
{
java.awt.image.BufferedImage image=null;
new Thread().sleep(1000);
javax.swing.JOptionPane.showMessageDialog(null,"test");
java.io.File file=new java.io.File("C:\file.png");
boolean boo=file.exists();
if(boo==true)
image=javax.imageio.ImageIO.read(file);
}
catch(InterruptedException e){}
}
}
基本上,我必须使用BCEL来访问字节码并达到我的目标。因此,我尝试创建简单的代码:
import org.apache.bcel.Repository;
import org.apache.bcel.classfile.*;
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();
}
}
}
结果:
local variable : this --> LTest;
local variable : image --> Ljava/awt/image/BufferedImage;
local variable : file --> Ljava/io/File;
local variable : boo --> Z
local variable : ex --> Ljava/lang/Exception;
local variable : this --> LTest;
local variable : a --> I
如何将已检索到的基元类型(如a
作为int
,boo
作为boolean
)以及如何检索未使用的局部变量(如String b
)?
-谢谢-
LocalVariableTable
似乎不包含未使用的String。当我通过初始化它来"使用"它时,变量将被添加到表中。我搜索并根据这个线程,JIT(或者编译器?因为它是创建字节码的人)优化了代码,并从字节码中完全删除了未支持的var。