猿问

创建 MethodNode 失败并显示 IllegalStateException

我想获得MethodNodeofmain()功能


public class TestMethodNode {      

    public void main() {            

    }

}

所以我试过这个


import org.objectweb.asm.ClassReader;

import org.objectweb.asm.ClassVisitor;

import org.objectweb.asm.ClassWriter;

import org.objectweb.asm.MethodVisitor;

import org.objectweb.asm.tree.MethodNode;   

import static org.objectweb.asm.Opcodes.ASM7; 

import java.io.IOException;    


public class Instrumentation {

    public byte[] editFunction(String className) throws IOException {    

        byte[] modifiedClass = null;    

        try {    

            ClassReader classReader = new ClassReader(className);

            ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_FRAMES);

            ClassVisitor classAdapter = new ClassVisitor(ASM7, classWriter) {    

                public MethodVisitor visitMethod(

                        int access,

                        String name,

                        String desc,

                        String signature,

                        String[] exceptions) {    

                    if (name.equals("main")) {

                        final MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);

                        MethodNode methodNode = new MethodNode(access, name, desc, signature, exceptions) {

                            public void visitEnd() {

                                // transform / analyze method here

                                accept(methodVisitor);

                            }

                        };    

                        return methodNode;

                    }  else {  

                        return super.visitMethod(access, name, desc, signature, exceptions);

                    }

                }

            };    

            throw ex;

        }    

        return modifiedClass;

    }

}

并IllegalStateException在创建时从 .../asm/tree/MethodNode.java 获取MethodNode

我在做什么错?(我不想破解 Minecraft,我正在研究并尝试操作调用堆栈,其中涉及 lambda 表达式和嵌套/内部类,用于在运行时使用字节码操作的工作流引擎。)


眼眸繁星
浏览 175回答 2
2回答

MM们

从构造函数MethodNode(int access, String name, String descriptor, String signature, String[] exceptions)的文档中:...子类不得使用此构造函数。相反,他们必须使用MethodNode(int, int, String, String, String, String[])版本。由于您正在创建一个子类,因此您必须更改调用new MethodNode(access, name, desc, signature, exceptions) {…}到new MethodNode(ASM7, access, name, desc, signature, exceptions) {…}

婷婷同学_

只是为了提供一个完整的运行样本来检测main()给定类的函数public class Instrumentation {&nbsp; &nbsp; public byte[] instrument(String className) {&nbsp; &nbsp; &nbsp; &nbsp; byte[] modifiedClass = null;&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ClassReader classReader = new ClassReader(className);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ClassWriter classWriter = new ClassWriter(classReader, 4);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ClassVisitor classVisitor = new ClassVisitor(ASM7) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public MethodVisitor visitMethod(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int access,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String name,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String desc,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String signature,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] exceptions) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (name.equals("main")) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MethodNode methodNode = new MethodNode(ASM7,access, name, desc, signature, exceptions) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void visitEnd() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // do some stuff here; remove exceptions, insnnode etc. -- smaple iterates through instructions&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < this.instructions.size();i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AbstractInsnNode node = this.instructions.get(i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return methodNode;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return super.visitMethod(access, name, desc, signature, exceptions);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; classReader.accept(classVisitor,0);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; classReader.accept(classWriter, 0);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modifiedClass = classWriter.toByteArray();&nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException ex) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// handle IOException here&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return modifiedClass;&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Java
我要回答