问题标签 [javap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - javap 可以显示与 objdump -S 之类的字节码混合的原始源代码行吗?
我知道编译时此调试信息包含在 .class 文件中:
并且可以从以下LineNumberTable:
部分手动观察:
我想要的是javap
在字节码中间显示源代码。
样本输入:
实际javap
输出:
所需的 javap 输出:
这将使解释javap
输出变得更加容易。
类似但更通用的问题:如何使用 javap 查看哪些字节码行对应于 Java 代码中的行?
我试图:
- 在以下位置创建功能请求:http ://bugreport.java.com/submit_intro.do
- 向邮件列表发送电子邮件:
jdk9-dev@openjdk.java.net
但是没有回复,我的消息甚至没有出现在那些网站上。不是一个非常开放的项目。
java - Java找不到类文件,而javap可以
我使用Java ASM library编译了一个类(称为 Test.class) 。我决定尝试使用“java”命令运行它,以确保我已经正确编译了该类。
但是,当我这样做时,我收到了“无法找到或加载主类测试”消息。我认为这很奇怪,因为该类位于当前工作目录中(我也尝试将“。”作为类路径传递,但无济于事)。然后我尝试用“javap”对其进行分解,效果很好,这很奇怪,因为如果javap可以找到类文件,那么java肯定也应该能够吗?
这是我的命令行输入和输出:
$ javap -c 测试
$ java 测试
错误:无法找到或加载主类测试
$ java 测试类
错误:无法找到或加载主类测试
$ java -cp 。测试
错误:无法找到或加载主类测试
$ java -cp 。测试类
错误:无法找到或加载主类测试
可能出了什么问题?我可能错误地编译了该类,但是javap肯定会像java一样抱怨,并且javap输出看起来是正确的。
java - javap -c -v -l -s HelloWorld.class 不显示 LocalVariableTable
我正在尝试理解 Java 字节码。我使用命令分析我的简单 HelloWorld javap -c -v -l -s HelloWorld.class
。但是,我看不到 LocalVariableTable 条目。这是为什么?它被忽略了吗?我在 OS X 10.10.4 上运行 java 1.8.0_45。感谢您的帮助,谢谢!
结果:
java - 如何读取反汇编 Java Bytecode 产生的助记符的元数据?
我以前从未使用过Javap。有人可以解释这个例子中的“代码”是什么意思吗?它出现了三次。在下面几行的助记符的上下文中,它是什么意思?它是否表明还有另一个堆栈框架或其他东西?:
我查看了 JVM 的规范并没有找到任何解释“代码:”的内容,但如果事实证明我忽略了它,我很高兴发布该部分的链接。谢谢。
java - Java:匿名类的初始化和构造函数
我想了解我在处理匿名类时遇到的一种奇怪行为。
我有一个在其构造函数中调用受保护方法的类(我知道,糟糕的设计,但那是另一回事......)
然后我有另一个扩展A
和覆盖的类init()
。
如果我编码
我明白了
这是意料之中的,因为超类的构造函数是在B
ctor 之前调用的,然后value
是静止的。
但是当使用这样的匿名类时
我希望得到value=0
,因为这应该或多或少等于 class B
:编译器自动创建一个新类,该类C$1
扩展A
并创建实例变量以存储在匿名类的方法中引用的局部变量,模拟闭包等......
但是当你运行这个时,我得到了
最初我认为这是因为我使用的是 java 8,也许在引入 lamdbas 时,他们改变了匿名类在后台实现的方式(你不再需要final
),但我尝试使用 java 7也得到了同样的结果......
实际上,用 看字节码,我可以javap
看到B
而对于C$1
:
有人能告诉我为什么会有这种差异吗?有没有办法使用“普通”类来复制匿名类的行为?
编辑:澄清问题:为什么匿名类的初始化会破坏任何其他类的初始化规则(在设置任何其他变量之前调用超级构造函数)?或者,有没有办法B
在调用超级构造函数之前在类中设置实例变量?
java - 用 javap 反汇编的枚举不显示构造函数参数
当我用 javap 反汇编一个枚举时,枚举的隐式构造函数参数似乎丢失了,我不知道为什么。
这是一个枚举:
我使用以下命令编译和反汇编它(在 Java 8u60 上):
这是我得到的输出:
我的困惑在于用于实例化每个枚举常量的私有构造函数。反汇编表明它不带参数 ( private Foo();
),但它确实带参数。例如,您可以看到load
读取传递的枚举常量名称和序号以及this
指针的指令,并将它们传递给需要它们的超类构造函数。静态初始化块中的代码还显示它在调用构造函数之前将这些参数压入堆栈。
现在我会假设这只是 javap 中的一个不起眼的错误,但是当我使用 Eclipse 的编译器编译完全相同的枚举并使用 javap 反汇编它时,构造函数完全相同,只是显示了参数:
我的问题是: javac 编译的枚举和 Eclipse 编译的枚举在物理上有何不同,导致 javap 不显示 javac 编译的枚举的构造函数参数?这种差异是否是一个错误(在 javap、javac 或 Eclipse 中)?
java - 可视化的 javap 工具
您好,我已经创建了这个工具 并且我添加了一个功能,任何人都可以在没有任何包名称的情况下搜索类的信息。我的问题是现在我想添加每种方法的信息,这意味着我需要从 javadoc html 文件中获取信息所以告诉我我解析所有 html 因为我不想嵌入整个 html 我想要某些文本
java - 查明 .class 文件是否实现接口
给定类文件的路径,如何确定它是否实现了某个接口?
我可以使用 javap 并解析输出,但可能有更智能的方法。
我不想解析源代码,因为它可能不可用。我还应该注意,类文件的路径仅在运行时可用。
java - javap是否缺少一些行号?
如果我编译以下源代码:
使用 Java-7(OpenJDK 或 Oracle)我得到以下 LineNumberTable:
但是,使用 Java 8(OpenJDK 或 Oracle)编译相同的源代码,我得到另一个 LineNumberTable:
为什么 Java 7 返回的 LineNumberTable 不包括第 4 行和第 5 行?
为什么 Java 8 返回的 LineNumberTable 不包括第 5 行?
java - 我可以稳定编译器写入字节码 .class 文件的函数的输出顺序吗?
如果我跨编译在我的主应用程序类上执行 javap(没有源代码更改),有时函数的顺序会有所不同。如果构建是在不同的环境中执行的,则尤其如此。
考虑两个构建的输出。构建 1:
构建 2:
这种差异导致像 pkgdiff 这样的工具相信类在构建之间发生了变化。
有没有办法强制编译器产生稳定的输出顺序?