1

私はASMライブラリを調べてきました。まず、Hello World クラスを構築するプログラムを作成し、次にもう少し複雑なことを試して、PythonInterpreter (Jython ライブラリの一部) を作成し、python ファイルを実行するクラスを構築しようと考えました。結果は次のとおりです。残念ながら、結果のクラスを実行しようとすると、この質問に名前を付けた例外が発生します。

public class Main {
public static void main(String[] args) {
    String mainFile = "main.py";

    ClassWriter mainClass = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    mainClass.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "Main", null, "java/lang/Object", null);
    MethodVisitor mainMethod = mainClass.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);

    mainMethod.visitTypeInsn(Opcodes.NEW, "org/python/util/PythonInterpreter");
    mainMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, "org/python/util/PythonInterpreter", "<init>", "()V");

    mainMethod.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    mainMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/python/util/PythonInterpreter", "setOut", "(Ljava/io/PrintStream;)V");
    mainMethod.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
    mainMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/python/util/PythonInterpreter", "setErr", "(Ljava/io/PrintStream;)V");

    mainMethod.visitLdcInsn(mainFile);
    mainMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/python/util/PythonInterpreter", "execFile", "(Ljava/lang/String;)V");
    mainMethod.visitInsn(Opcodes.RETURN);

    mainMethod.visitEnd();
    mainClass.visitEnd();

    try{
        byte[] b = mainClass.toByteArray();
        FileOutputStream writer = new FileOutputStream("Main.class");
        writer.write(b);
        writer.close();
    }catch(IOException e){
        e.printStackTrace();
    }
}

}

4

1 に答える 1

1

setOutandメソッドについては、引数のみがsetErrあり、メソッドを呼び出すオブジェクトはありません。<init>(初期化したオブジェクトを「消費」するための呼び出し!)

同じことがへの呼び出しにも当てはまりますexecFile。引数(mainFile)がありますが、呼び出すオブジェクトがありませんexecFile

DUPの直後に3つのinstructinoを追加してみてくださいNEW。(そのオブジェクトに対して実行する3つのメソッド呼び出しに十分な参照を保存するため。)

于 2010-12-05T08:09:42.100 に答える