如何在Javassist中删除以前添加的代码块?

时间:2013-12-25 16:13:56

标签: java javassist

有没有办法在Javassist中删除以前添加的代码块?

我正在开发一个通过Javassist修改 .class 文件的项目。除此之外,它还在构造函数中添加了一些代码。我希望这个进程可以在同一个.class文件上一次又一次地运行,没有任何副作用。但是目前,每次运行后,相同的代码会再次添加到构造函数中。

有没有办法阻止这种情况?

1 个答案:

答案 0 :(得分:0)

如果你知道要删除的代码,你可以轻松地使用Javassist:

在下一个示例中,这将删除包含任何“Exception”类的方法“printStackTrace”的所有行,所有 magic instrumentreplace一起发生方法

 ... 
 ClassPool cp = ClassPool.getDefault();
 try{
     CtClass ct = cp.getCtClass("com.cm.main.ConcretClass");
     CtMethod m = ct.getDeclaredMethod("testException");
     m.instrument(new ExprEditor() {
            public void edit(MethodCall m) throws CannotCompileException {
                String regexPattern = ".*Exception";
                if (m.getClassName().matches(regexPattern) && m.getMethodName().matches("printStackTrace")) {
                    m.replace(";");
                }
            }

            ;
        });
    } catch (CannotCompileException e) {
        e.printStackTrace();
    } catch (NotFoundException e) {
        e.printStackTrace();
    } catch (BadBytecode badBytecode) {
        badBytecode.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
... 

ConcretClass

public class ConcretClass{

public String getName() {
    return this.name + "-Extra";
}

public void testException(){
    try {
        FileOutputStream file = new FileOutputStream("C:\\Temp\\downloads");
        file.close();
    } catch (FileNotFoundException e2) {
        e2.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
   }
 }