Java字节代码的"内联汇编"

And*_*lav 16 java bytecode

我正在寻找以下想法的现有实现:假设有人想在普通Java程序中编写"内联汇编"字节代码(大多数相关应用程序将涉及Java中无法提供的invokedynamic指令).一种方法是:

void foo(boolean b) {
    Label l1 = Asm.label();
    Label l2 = Asm.label();

    int i = Asm.no_int();
    Asm._const(0);
    Asm.store(i);
    l1.bind();
    Asm.load(i);
    Asm.push(10);
    Asm.if_cmpge(l2);
    Asm.getstatic("java/lang/System", "out", "Ljava/io/PrintStream");
    Asm.load(i);
    Asm.invokevirtual("java/io/PrintStream", "println", "(I)V");
    Asm.inc(i);
    Asm._goto(l1);
    l2.bind();
    Asm._return();
}
Run Code Online (Sandbox Code Playgroud)

指令被编码为API调用,然后我们需要运行普通的java编译器,然后对字节代码进行后处理并用实际指令替换API调用.

PS我知道ASM框架的ASMifier,它没有解决上述问题.

jas*_*son 6

ClassLoader有一个方法,defineClass可以让你通过提供字节码动态生成一个类.将此与Javassist此前一个问题的其他建议相结合.