问题标签 [jvm-bytecode]

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.

0 投票
10 回答
63726 浏览

jvm-bytecode - 读取和显示 Java .class 版本的工具

你们有谁知道一个工具可以搜索 .class 文件,然后显示它们的编译版本?

我知道您可以在十六进制编辑器中单独查看它们,但我有很多类文件要查看(我的巨型应用程序中的某些内容由于某种原因正在编译为 Java6)。

0 投票
3 回答
8784 浏览

java-bytecode-asm - 动态 Java 字节码操作框架比较

有一些用于动态字节码生成、操作和编织的框架(BCEL、CGLIB、javassist、ASM、MPS)。我想了解它们,但是由于我没有太多时间了解它们的所有细节,所以我希望看到一种比较图表,说明一个与另一个的优缺点以及对它们的解释为什么。

在 SO 中,我发现很多问题都在问类似的问题,答案通常是“你可以使用 cglib 或 ASM”,或者“javassist 比 cglib 好”,或者“BCEL 已经老了,快要死了”或者“ASM 是最好的,因为它给出了 X 和 Y”。这些答案很有用,但并没有完全回答我想要的范围内的问题,更深入地比较它们并给出每个的优缺点。

0 投票
1 回答
219 浏览

android - 如何使用 dedexer 解释这个反汇编的行?

以下是在 android 市场应用程序上使用 dedexer 反汇编的 snipcode,在 中invoke-virtual我不明白原始 Java 代码是什么:

invoke-virtual {v0},[Lcom/google/android/providers/AbstractGDataSyncAdapter$ClientDiffType;/clone ; clone()Ljava/lang/Object;

[应该是一个数组,那么它是在类型数组中的元素上调用方法clonecom/google/android/providers/AbstractGDataSyncAdapter$ClientDiffType?那为什么;在类名和方法名之间有clone呢?dedexer 本身的错误?

0 投票
2 回答
732 浏览

android - Dalvik 字节码中的“抛出”和“异常注释”

为什么生成字节码为

而不是.throws Ljava/io/FileNotFoundException

如果一个方法throws FileNotFoundException在java代码的头文件中声明?

0 投票
1 回答
2191 浏览

if-statement - 如何为 if-else 语句生成字节码

如何使用可选的 ELSE 分支生成与字节码指令对应的代码 IF THEN - ELSE?

例如,程序 If-else.pas 被认为是正确的,而程序 If.pas 则被认为不正确,因为它不包含 ELSE 分支。

if-else.pas

如果.pas

所以 Jasmin 给了我这个错误:

Output.j:62:JAS 错误:标签:L11 尚未添加到代码中。

Output.j: 发现 1 个错误

我的语法 .g 有这个规则:

对于 if-else 语句,我写了这个:

但是通过这种方式,第二个分支不是可选的,而是必须始终存在。我如何使它成为可选的?我认为问号 ( ( 'else' s2 = stmt )?) 是必要的,但没有。我正在使用 ANTLR。

谢谢。

我不知道 Jasmin 生成的字节码文件(.j)是否有用,但我写了它。

如果-else.j

如果.j

0 投票
1 回答
1477 浏览

java - Java 字节码签名

作为我正在研究的编程语言的编译器的一部分,我在字节码中遇到了通用签名,我正在尝试对其进行解析并转换为 AST。解析算法大部分都有效,但似乎有一种特殊情况,这些签名的格式表现得有点奇怪。以下是其中一些案例:

在这些类中的所有方法中,只有这些方法::在其签名中。我的问题是这个令牌做什么以及它为什么存在。

编辑

我知道Java Language::中的运算符,但这是字节码级别的东西。

0 投票
1 回答
503 浏览

java - JVM 常量池条目

查看在某些类上运行的输出javap,我遇到了以下奇怪现象:

一些类的常量池包含诸如

为什么这些常量会出现在常量池中?

0 投票
1 回答
769 浏览

java - 为什么没有ICMP指令?

你们中的一些人可能知道,我们有大量的操作码来比较不同类型的原始值:

由于显而易见的原因,指令集的创建者并没有费心添加所有IF_LCMPEQ, IF_FCMPLT, ... 指令,但我想知道为什么没有ICMP指令,因为它特别适用于布尔值或Integer.compare(int, int).

0 投票
1 回答
1078 浏览

java - 带有输出值的 ASM Try/Catch 块

我目前正在尝试使我的自定义编译器允许try/catch用作表达式,即在堆栈上留下一个值。类型检查器和后端已经支持这一点,但问题似乎是 ASM 的COMPUTE_FRAMES. 使用以下代码进行检测:

编译这段代码:

VerifyError我在类加载时得到以下信息:

由于我认为 ASM 在计算try/catch具有输出值的块的堆栈帧时没有问题,所以我的检测代码有问题吗?(请注意ClassWriter.getCommonSuperclass,虽然这里不需要,但已正确实现。)

0 投票
0 回答
117 浏览

java - 内部类中断 Eclipse 代码完成

我在 Eclipse 禁用导入二进制文件的 Java 类中的所有代码完成时遇到了严重问题。二进制文件由自定义编译器编译为基于 JVM 的自定义编程语言,代码如下所示:

Entry是接口里面的一个Map接口,都是Java写的。编译器显然对这段代码没有任何问题,并生成以下字节码(来自javap):

从任何 Java 类导入Test该类会导致 Eclipse 抱怨No completions available,并且CTRL-Hover不再工作。为了找到问题,我创建并javap编辑了上述类的 Java 等效项,产生以下结果:

测试.java

javap输出

我设法找到了由 class 引起的问题implements Entry[A, B],但我还无法识别字节码中的实际问题。我的编译器生成的字节码有什么问题吗?除了包名和行号之类的东西,我找不到两个类的字节码之间的显着差异。


如果这不是编译器的错,我只有ANTLR 4,Bytecode OutlineEclipse Class Decompiler插件。