2013-11-04 33 views
2

我想能够编辑字节码并重新编译为可执行的类文件。我不知道如何做到这一点。我尝试使用javap -c和-v进行反编译,编辑某些内容,并将其更改回我的Class文件,但出现错误“错误:无法找到或加载主类Test.class”。我也想从字节码中生成java源代码。任何帮助?我想自己做这个,而不使用外部程序。如果可能,我想自己做。如何重新组装由javap生成的java字节码?

+0

你为什么要这么做?这种打败了使用Java的目的。它只是其中之一,“因为我可以”的东西? – MadConan

+2

@ tycoon177:如果这是你的目标,你可以编写你自己的java编译器。 – MadConan

回答

1

Javassist(Java编程助手)是Java的加载时反射系统。它是用于编辑Java中的字节码的类库;它使Java程序能够在运行时定义一个新类并在JVM加载它之前修改一个类文件。 http://java-source.net/open-source/bytecode-libraries

+0

我会这样做,但我想自己做,而不是使用预先写好的工具。 (除必要之外)。如果可以的话,我想做字节码到类文件的转换以获得自己的源码。 – tycoon177

+0

你必须学习Class文件格式,所以仔细阅读整个页面http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html。更有可能你有许多编码解析方法的问题。因此,我强烈建议你不要这样,直到没有特殊目的。 –

1

java平台(如JDK中)不提供将类型代码源编译为类文件的工具(它甚至没有真正指定JLS中的汇编语法)。

在字节码汇编程序的帮助下,您可以像汇编程序那样使用字节码。看看Jasmin:http://jasmin.sourceforge.net/(虽然语法与javap输出的语法不完全相同)。

4

javap的输出不适合汇编程序的输入。如果您想要反汇编和重新组合Java字节码,您需要执行以下操作之一:

  1. 使用第三方汇编程序格式的第三方工具。
  2. 编写自己的工具(dis)组装第三方汇编程序格式。
  3. 编写使用自己的汇编程序格式的工具。

我会看看SootKrakatau,它们都具有完整(dis)组装能力。烟灰支持一些字节码的中间表示。我相信Krakatau使用基于流行的Jasmin的表示(尽管该工具本身是用Python编写的)。

+1

它基于Jasmin语法,但它扩展它以提供对类文件的更多控制,并修复原始Jasmin语法中的一些歧义。 – Antimony

相关问题