Java字节码的“内嵌汇编”

17

我正在寻找以下想法的现有实现:假设有人想在普通 Java 程序内编写“内联汇编”字节码(最相关的应用程序将涉及 invokedynamic 指令,该指令在 Java 中不可使用)。一种方法是:

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

指令被编码为API调用,然后我们需要运行一个普通的Java编译器,最后对字节码进行后处理,将API调用替换为实际指令。

附注:我知道ASM框架的ASMifier,但它无法解决上述问题。


2
JNI 用于连接“本地实现”(使用 C、C++ 编写),他正在请求“内联字节码”。 - morgano
2
反编译器在迷惑时通常会将内联字节码作为注释输出。但这并不完全相同。 - Antimony
2
有一个专门讨论专利先前技术的Stack Exchange网站:http://patents.stackexchange.com/ - tacaswell
1
@tcaswell:我认为他所说的“先前技术”不是指这个。 - jason
1
我认为它应该内联。 - Andrey Breslav
显示剩余6条评论
2个回答

6

ClassLoader有一个方法,defineClass,使您可以通过提供字节码来动态生成类。结合Javassist或其他建议,可以从此问题中找到。


我正在寻找内联汇编。 - Andrey Breslav

1
如果你正在寻找专利的“先前技术”,我认为JNode本地代码编译器在其版本的 Unsafe 类中使用了某些方法处理这种情况。 但是,这些基元不是字节码。 相反,它们是无法表示为字节码的内容。

以这种方式注入字节码对我来说似乎不是一个好主意:

  • 有更好的方法来实现; 例如BCEL。

  • 将注入的字节码与方法的其余部分集成起来可能会很棘手(对于程序员)。特别是考虑到方法的其余部分的字节码将取决于您使用的java编译器。

  • 对于传统JVM平台上的Java,您需要在类加载之前将Asm“调用”翻译为字节码。然后它将受验证器的检查。


1
专利是邪恶的。我只是在寻找相同想法的一些实现。 - Andrey Breslav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接