如何在Eclipse IDE中查看Java的字节码?

23
有时候在Eclipse中,我会按下一组键,它会带我进入编辑器页面,显示我的.class文件(字节码)的内容。我似乎永远记不住那个键组合是什么。
请问有人可以告诉我吗?
换句话说,怎样才能查看自己的字节码呢?

1
你应该更改问题的标题。它过于依赖IDE,否则就会重复这个问题:https://dev59.com/CGYq5IYBdhLWcg3w2EJi。 - Gilberto
7个回答

11
使用以下外部工具配置,我们可以在Eclipse中使用javap查看Java字节码:

enter image description here

为了获取上述弹出窗口,请选择“运行”选项,然后选择“外部工具”,再选择“外部工具配置...”。

enter image description here

${system_path:javap} 用于定位 Eclipse 使用的 JDK 中的 javap。您可以使用 javap 的绝对路径。

${project_loc} 返回项目的绝对路径。这是用于定位资源的 .class 文件的,因为我找不到一个预定义的变量来使用,所以 javap 在项目目录而不是包含 .class 文件的目录中运行。

传递给 javap 的参数之一:

  • bin 是 Eclipse 项目的默认输出文件夹。将其更改为项目使用的 build/classes 或其他值。请注意,该值相对于 ${project_loc};您也可以指定绝对路径。
  • ${java_type_name} 用于获取选定的类名。
你可以在项目浏览器视图或项目导航器视图中选择Java文件,甚至可以在任何视图中选择Java类型,然后运行外部工具。请注意 - 当您选择方法、内部类等并运行工具时,此方法效果不佳,因为它们本身不是资源,会导致${project_loc}为空的情况。

源代码


Dr. Garbage工具是一套在Apache开源许可下发布的Eclipse插件。

使用Eclipse Marketplace安装Bytecode Visualizer

查看字节码:

  1. 右键单击.java文件,选择打开方式并选择其他,您会得到以下弹出窗口:
    enter image description here

  2. 搜索“Bytecode Visualizer”并选择打开该文件,如下所示,您可以找到如下所示的字节码选项:
    enter image description here


增强型类反编译器

在"窗口 > 首选项 > 通用 > 编辑器 > 文件关联"中将默认文件关联改为.class关联没有源代码的.class关联都使用"类反编译器查看器"。

"*.class" : 默认情况下选择了"类反编译器查看器"。

"*.class without source" : 默认情况下选择了"类反编译器查看器"。

enter image description here


它给出了以下错误:"在http://sourceforge.net/projects/drgarbagetools/files/eclipse/4.5/stable/上找不到存储库。" - alper
javap 的外部工具设置对于顶层类非常有效,但它无法找到嵌套类。 - James
1
请添加开关 -XDinner,以显示嵌套类。 - James

11
Eclipse的默认类文件查看器会显示源代码(参见VonC的答案),如果已经与二进制关联,则会显示javap样式的类视图(还有一个选项可以附加源代码)。我猜你想要的是后者。
我从未找到过一种干净的方法来强制Eclipse显示该输出而不是链接的源代码。你可能需要一个提供Javap功能(或javap接口)的Eclipse插件。寻找声称它们“反汇编”(而不是像jad一样“反编译”的)插件。
如果没有插件,您可能可以配置一个外部工具来执行javap,但它可能与其他eclipse功能不兼容。
编辑:让我明确上面的内容:如果您按F3键,Eclipse将执行以下操作(通常情况下,实际过程可能会略有不同):
1. 解析目标(如果您选择Java文件,则将是Java文件本身;如果选择或光标位于类名上,则为类声明,方法声明等类似)。 2. 在构建路径上搜索(首先是同一项目)包含目标的Java文件。 如果找到,则打开一个可写编辑器显示该Java源文件。 3. 对于类/方法声明,继续在构建路径上搜索包含该声明的类文件的引用。 如果找到了,则 a) 如果已将源代码附加到类文件上,则打开链接Java文件的只读编辑器。 b) 如果类文件没有附加源,则打开一个只读面板,显示编译后的类文件的反汇编(javap样式)字节码。
我的猜测是,您认为有专用于3.b)的键序列,但我认为没有。 但同样,我很乐意被证明错误。

有一些默认的键组合可以显示字节码。如果我没有表达清楚,请原谅。那就是我所指的。 - James Raitsev
你说得很清楚,我理解得很好。但我认为你可能是错了,或者这个功能是由一个非默认插件提供的。如果我错了,我会很高兴被证明是错误的,因为我可以使用这样的快捷方式。如果你知道这是真的,为什么不通过“首选项->常规->键”找到绑定并在这里报告呢?谢谢。 - Mark Peters
顺便说一下,我的答案确实涉及字节码。当我说类似于javap的视图时,这就是我的意思。Javap是JDK工具,用于显示已编译类文件的字节码。 - Mark Peters

9

您可以使用ASM 4.0插件。

enter image description here

安装

可以通过Eclipse Update Manager和ObjectWeb Eclipse Update Site http://download.forge.objectweb.org/eclipse-update/来安装Bytecode Outline插件。另外,也可以从ObjectWeb Forge网站下载插件并手动安装到Eclipse插件目录。

使用

查看当前.java或.class文件的字节码:

Window -> Show View -> Other -> Java -> Bytecode

比较两个.java或.class文件的字节码:

选择两个*.class或*.java文件 -> 右键单击 -> Compare with -> Each Other Bytecode

或者

选择一个*.class或*.java文件 -> 右键单击 -> Compare with -> Another Class Bytecode

http://asm.ow2.org/eclipse/index.html


我更喜欢这个工具的格式:http://www.drgarbage.com/bytecode-visualizer/ - kd8azz

3

好的...如果在导航器视图或包资源管理器视图中选择了.class,只需按下F3即可在编辑器中打开反编译版本。

http://img822.i_mageshack.us/img822/8735/eclipseclass.png


1
或者当您在Java代码中将光标悬停在类型上时(或者按CTRL + 单击)。请注意,Eclipse实际上并没有反编译任何内容。您只需将源代码与二进制源代码关联起来即可。您看到的源代码可能与编译后的类文件完全无关。BufferManagerWriteCollect的源代码恰好包含在JDK中。尝试打开sun.**子包中的任何内容,您就会明白我的意思。 - Mark Peters
@Mark:我同意,即使它不完全是一个“键的组合” ;) 但是再说一遍,我的<kbd>F3</kbd>建议也不是! - VonC

2
如用户833970所提到的:Bytecode Outline插件:http://andrei.gmxhome.de/bytecode/index.html 基本上,它为当前打开的Java文件提供了一个“字节码”视图,这正是您要寻找的。
但是,您也可以将其分配给加载任意随机的.class文件,而不是默认的.class查看器,并且在许多方面都超过了它。例如,如果您在概述视图中单击成员,则此查看器实际上会跳转到字节码中的正确位置。
下载链接(用于dropin使用)可以在上述链接中找到,更新站点为http://andrei.gmxhome.de/eclipse/

1
如果您真的对字节码感兴趣,有一个Eclipse插件可以让您使用文本编辑器打开和编辑.class文件的字节码。

https://github.com/itemis/jbc

enter image description here


0

我已经尝试了几种不同的解决方案。 我个人认为,Bytecode Visualizer(可以在此处获取:https://sourceforge.net/projects/drgarbagetools/)是最好的解决方案。它整洁地显示输出,并清楚地说明它如何与源代码链接。我注意到一些字节码存在轻微的误解释,但可以理解其要点。

不幸的是,在撰写本文时,它似乎不支持Neon。但它确实支持Mars。


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