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();


上一篇:
下一篇:
切换中文