了解Java字节码(Understanding Java Byte Code)

2019-08-17 19:03发布

通常我坚持不包含源Java类文件,我想了解我手头的问题。

注意反编译器是有用的,但在所有的情况下不充分......

我有两个问题

  1. 什么工具可以查看Java字节码(优选地可从Linux命令行)
  2. 什么是很好的参考,以熟悉Java字节代码语法

Answer 1:

而不是直接在Java字节码,这将需要与Java虚拟机及其操作的熟悉程度看,一个可以尝试使用Java反编译工具。 反编译器将尝试创建一个java从指定的源文件class文件。

该如何“反编译” Java类文件? 是将信息以找出如何编译Java中的相关问题class文件。

这就是说,一个可以使用javap命令,它是为了拆卸的Java JDK的一部分class文件。 输出javap将是包含在了Java字节码class文件。 但不要被警告,字节码并不像Java源代码的。

定源学习有关Java字节码和Java虚拟机本身是Java虚拟机规范,第二版 。 特别是, 第6章:Java虚拟机指令集具有的所有字节码指令的索引。



Answer 2:

要查看类文件的字节码指令,使用javap -v命令,以同样的方式,如果你运行Java程序的,指定的类路径(如有必要)和类名。

例:

javap -v com.company.package.MainClass

关于字节码指令集, 指令集摘要



Answer 3:

Fernflower是一种分析反编译,所以它会反编译的类为可读java代码而不是字节码。 如果你想了解代码是如何工作它更有用。



Answer 4:

如果你有一个类,并没有源代码,但你有一个错误,你可以做两件基本的事情之一:

  1. 反编译,修正错误并重新创建jar文件。 我以前做过这个,但系统管理员持怀疑态度有关把该投入生产。
  2. 写出类单元测试,确定是什么原因造成的错误,报告本单元测试的错误,并等待它是固定的。

    (2)一般是一个系统管理员,以我的经验,比较喜欢。

    如果你有去(2)然后,在此期间,因为你知道是什么原因造成的错误,你可以不会允许输入要去类,以防止问题,或者在错误发生时做好准备,妥善处理。

    你也可以用AspectJ代码注入问题类,并改变方法的行为,而实际上重新编译。 我想,这可能是最好的选择,因为你可以改变它可能调用函数的所有代码,而不必担心教大家这个问题。

    如果你学会阅读字节码指令,你会做什么来解决这个问题?



Answer 5:

我有两个问题

1)什么工具可用来查看Java字节码(优选地可从Linux命令行)

javap工具(使用-c选项)将拆解字节码文件。 它在命令行上运行,并且被提供作为Java SDK的一部分。

2)什么是很好的参考,以熟悉Java字节代码语法

javap工具使用相同的语法如在JVM规范被使用,并且JVM规范自然是权威来源。 我还发现“里面的Java虚拟机”,由比尔。 我从来没有读过它,它看起来可能是绝版。

实际(文本)语法很简单,自我解释......假设你有什么解释字节码做一个参考,而你是适度熟悉在这个级别识别代码。 但它可能是更容易阅读反编译的输出,即使字节码已通过混淆器供电。



Answer 6:

您可能会发现Eclipse的字节代码大纲插件有用:

http://andrei.gmxhome.de/bytecode/index.html

我没有用它自己 - 只是看到它在传递提及。



文章来源: Understanding Java Byte Code
标签: java bytecode