在Java字节码中编程

47

我想要在Java字节码中编写一个简短的程序(可能是“Hello World”)。 我只希望使用文本编辑器编写字节码并运行它。 我该如何做? 有示例吗? 谢谢!


阅读 https://docs.oracle.com/javase/specs/jvms/se7/html/index.html 并在 bash 中使用 printf :-) - Ciro Santilli OurBigBook.com
3个回答

46
你可以尝试使用Jasmin
.class public HelloWorld
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
  .limit stack 3
  .limit locals 1

  getstatic      java/lang/System/out Ljava/io/PrintStream;
  ldc            "Hello World."
  invokevirtual  java/io/PrintStream/println(Ljava/lang/String;)V

  return

.end method

你可以使用以下命令进行编译:

> java -jar jasmin.jar hello.j

之后,您可以像运行任何类一样运行它:

> java HelloWorld
Hello World.

更新

我看到你的问题提到“不使用Javac或Java”,您能说明一下这个语句的意思吗?


8
这篇文章让我想要假装工作,然后拿着 Jasmin 工具来尝试一下。 :-) - corsiKa
1
@Bakkal:根据链接:“Jasmin最初是作为Jon Meyer和Troy Downing合著的《Java虚拟机》一书的伴侣而创建的,该书由O'Reilly Associates出版。” - Adam Paynter
“不使用Javac或Java”是指我想使用字节码编写代码。感谢信息! - Corey Stevens
哇~ 这太酷了。这个也是独立于JVM的吗?它能在黑莓JVM上运行吗? - Viele
Jasmin在普通使用时还可以,但它不支持类文件中许多更为晦涩的操作。如果您需要一个重型汇编器,请参考我的答案。 - Antimony
显示剩余4条评论

11

我创建了一个新的Java字节码汇编器,它向后兼容Jasmin,并且添加了许多新功能并略微简化了语法。

下面是一个编写Hello World程序的示例。

.class public hello
.super java/lang/Object

.method public static main : ([Ljava/lang/String;)V
    .limit stack 10
    .limit locals 10

    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc "Hello World!"
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V
    return
.end method

我还写了一个字节码汇编教程,目前只涵盖了Hello,World,如果有兴趣的话我可以继续编写。


3
链接已损坏。 - Manza
抱歉,看起来整个维基都不见了。我会发电子邮件给他们,看看能否恢复它或者有没有备份。 - Antimony

9

字节码是实际的字节编写而成,通常不易被普通文本编辑器编辑。

这意味着您需要一些将文本表示转换为二进制的工具。一个合理的起点可能是像Jasmin这样的汇编程序。


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