0
使用ASM,我需要修改一個方法,然後我需要在其中插入兩個方法。我已經修改好了,但是如何創建一個方法?我需要一個單獨的MethodVisitor
,還是我可以使用同一個,但打電話別的?使用ASM創建方法
使用ASM,我需要修改一個方法,然後我需要在其中插入兩個方法。我已經修改好了,但是如何創建一個方法?我需要一個單獨的MethodVisitor
,還是我可以使用同一個,但打電話別的?使用ASM創建方法
您需要在相應的ClassWriter上調用visitMethod以爲每個方法創建一個新的MethodVisitor。
MethodVisitor不能重複使用。如果要將方法插入現有類中,通常需要從ClassVisitor的visitEnd方法讀取原始類文件。
這種轉變的示意圖如下所示:
class TransformingClassVisitor extends ClassVisitor {
TransformingClassVisitor(ClassVisitor cv) { super(Opcodes.ASM5, cv); }
@Override
public MethodVisitor visitMethod(int opcode, String name, String owner, String desc, String signature, boolean iFace) {
MethodVisitor mv = super.visitMethod(opcodes, name, owner, desc, signature, iFace);
if (<isTransformedMethod>) {
return new TransformingMethodVisitor(mv);
}
return mv;
}
@Override
public void visitEnd() {
MethodVisitor m1 = super.visitMethod(<firstMethod>);
implement1(m1);
MethodVisitor m2 = super.visitMethod(<secondMethod>);
implement1(m2);
super.visitEnd();
}
}
所以我ClassVisitor將有visitEnd()方法。我的文件需要添加兩個方法。我會有三個MethodVisitors:一個用於我插入到方法中的代碼,另外兩個用於我要插入的兩個方法?但是,我只需要一個ClassVisitor? – JD9999
您需要實現一個MethodVisitor,通過包裝「超級」方法訪問來修改原始代碼。從包裝ClassWriter的ClassVisitor的VisitEnd方法中,您可以調用visitMethod兩次並直接在返回的MethodVisitor上插入代碼。 –
那麼我需要3個MethodVisitors?但是隻有一個ClassVisitor在其中我調用visitEnd()方法兩次? – JD9999