有没有办法在Javassist中删除以前添加的代码块?
我正在开发一个通过Javassist修改 .class 文件的项目。除此之外,它还在构造函数中添加了一些代码。我希望这个进程可以在同一个.class文件上一次又一次地运行,没有任何副作用。但是目前,每次运行后,相同的代码会再次添加到构造函数中。
有没有办法阻止这种情况?
答案 0 :(得分:0)
如果你知道要删除的代码,你可以轻松地使用Javassist:
在下一个示例中,这将删除包含任何“Exception”类的方法“printStackTrace”的所有行,所有 magic 与instrument
和replace
一起发生方法
...
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();
}
}
}