ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get("com.example.MyClass");
CtField field = ctClass.getDeclaredField("unusedField");
ctClass.removeField(field);
CtMethod method = ctClass.getDeclaredMethod("unusedMethod");
ctClass.removeMethod(method);
ctClass.writeFile();
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get("com.example.MyClass");
CtMethod method = ctClass.getDeclaredMethod("myMethod");
method.instrument(new ExprEditor() {
public void edit(MethodCall m) throws CannotCompileException {
if (m.getMethodName().equals("myMethod")) {
m.replace("{ $_ = $proceed(); }");
}
}
});
ctClass.writeFile();
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get("com.example.MyClass");
CtMethod method = ctClass.getDeclaredMethod("myMethod");
method.instrument(new ExprEditor() {
public void edit(FieldAccess f) throws CannotCompileException {
if (f.getClassName().equals("com.example.MyClass") && f.getFieldName().equals("myField")) {
f.replace("{ $_ = myField; }");
}
}
});
ctClass.writeFile();
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get("com.example.MyClass");
CtMethod method = ctClass.getDeclaredMethod("myMethod");
method.instrument(new CodeConverter() {
public void convert(MethodInfo methodInfo, ConstPool constPool, CodeAttribute codeAttribute) throws CannotCompileException {
CodeIterator iterator = codeAttribute.iterator();
while (iterator.hasNext()) {
int pos = iterator.next();
int opcode = iterator.byteAt(pos);
if (opcode == Opcode.INVOKEVIRTUAL) {
iterator.insert(codeAttribute, pos, new int[]{Opcode.NOP, Opcode.NOP});
iterator.insert(codeAttribute, pos, new int[]{Opcode.NOP});
}
}
}
});
ctClass.writeFile();