如何消除基元类型和不使用局部变量



我有一个简单的代码示例:

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作为intboo作为boolean)以及如何检索未使用的局部变量(如String b)?

-谢谢-

关于未使用的局部变量的检索:我运行了您的代码,发现LocalVariableTable似乎不包含未使用的String。当我通过初始化它来"使用"它时,变量将被添加到表中。我搜索并根据这个线程,JIT(或者编译器?因为它是创建字节码的人)优化了代码,并从字节码中完全删除了未支持的var。

相关内容

  • 没有找到相关文章

最新更新