问题标签 [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.
jvm - 调用期间 JVM PC 存储在哪里?
我目前正在阅读 JVM 的最新规范。很明显,每个线程都有自己的调用堆栈和自己的程序计数器,用于跟踪(下一条)要执行的指令。我的问题可能是转储,但从描述中,我找不到答案。
当new
调用一个或一个方法时,当前程序计数器存储在哪里?换句话说,调用方法后线程现在如何继续?
kotlin - 为什么 Kotlin 反编译器会生成 null.INSTANCE
我试图通过检查它在 Java 端的外观来了解 Kotlin 的一些功能。
所以作为一个实验,我尝试了这个:
所以上面代码片段的输出是:
如何理解上述反编译代码的静态块?为什么它会生成这个非工作代码?
scala - Type information for primitive types in polymorphic types
Given the following object:
When we compile this file to JVM bytecode, because of type erasure and due to the fact that Java does not support primitive types as parameters for generic types, this gets translated into a List<Object>
.
We can see this by compiling and inspecting the .class
with javap -l
:
But, if we compile this into a JAR file and later take it as a dependency in a different Scala project and try to set Foo.bar
to a different value, the Scala compiler will infer this type as List[Int]
, not List[Object]
:
After browsing around the .class
file, I could not find the information on the type parameter which would allow the Scala compiler to successfully infer this as List[Int]
.
Where is this metadata stored such that we can refer to this type as an actual List[Int]
instead of List[Object]
?
java - 带有 ASM 的 JVM INVOKESPECIAL 私有构造函数
我正在使用 ASM 生成一些字节码并动态执行它。但是有一种情况我需要调用私有构造函数,但我不知道如何。我知道可以通过反射(setAccessible)调用私有构造函数,但是我怎样才能直接在字节码/jvm中做到这一点?
当这段代码被 JVM 执行时,它会抛出 java.lang.IllegalAccessError。
java - 是什么将“接口名称”与“类名称”区分开来?
在java 8 规范的第 4.4.2 段(类似地在其他一些地方)中提到了它
类索引
class_index 项的值必须是 constant_pool 表的有效索引。该索引处的 constant_pool 条目必须是 CONSTANT_Class_info 结构(第 4.4.1 节),表示具有字段或方法作为成员的类或接口类型。
CONSTANT_Methodref_info 结构的 class_index 项必须是类类型,而不是接口类型。
我环顾四周,但据我所知,仅凭字节码是不可能区分接口类型和类类型的,即在运行时针对类加载器解析命名类/接口之前实际检查此要求。
我的假设是正确的,还是我错过了一种方法来单独检查类文件中的单个 CONSTANT_Class_info 的这个要求?
java - IF_ICMPNE 是什么意思?
对于以下 Java 类:
它的JVM指令是:
我知道第一个分支在第三行,第二个和第三个分支也一样,但是是什么意思,还有IF_ICMPNE
什么意思?I4
I13
I22
java - 如何使用字节码 ASM JAVA 中的方法包装变量
我试图在遍历方法节点中的指令时使用 ASM 加密方法调用中的参数中的变量。
现在我已经尝试在方法调用的前一行(在实际的 java 代码中)使字符串被加密。
IE。如果该行是 Logger("This is a log",a)
我的算法所做的是,a = Project.Util.encode(a); 在记录器的前一行。示例代码如下。
我从方法调用描述中计算参数。每当我找到一个变量时,我都会通过改变它的值来进行编码并且在方法调用字节结构的末尾(通过向上遍历)我将这些指令粘贴到它们之前。
但我想像这样删除它的用法。相反,我想做这样的。
Logger("这是一个日志",encode(a));
考虑我将变量 a 作为抽象节点。我尝试在这个特定变量之前和之后添加指令。
原来是失败,说堆栈中没有足够的空间。
请在这个观点上帮助我。
java - 为什么 AspectJ 会生成一个空的 Annotation 检查?
我正在使用 AspectJ 1.8.8 编译时编织,我有一个这样的块
where@SomeAnnotation
是通过“Around”建议实现的。
用 JD-GUI 查看字节码,我看到以下生成的代码(稍微格式化):
我想知道为什么那个条件 ( if (tmp56_53...)
) 甚至存在,因为它似乎什么都不做(而且在语法上也是不正确的 Java?也许是因为这是由 ajc 生成的?)。我对此感到好奇,因为它会导致覆盖工具(JaCoCo)中的“分支未命中”。
编辑 1
这是来自 javap 的原始 Java 机器代码:
看起来ifnonnull
可能是有条件的,但我对 JVM 指令一点也不熟悉,我仍然不知道为什么 AspectJ 会生成这样的逻辑。
java - 如何找到一些通用方法的局部变量的当前值?
我正在尝试编写一个实用方法,该方法将捕获调用它的方法的局部变量的当前值的快照(如果我理解正确,从字节码的角度来看,这些还包括方法参数) .
这是我要为每个局部变量捕获的信息:
我能够使用ASM
...找到名称和说明(类型)
问题:我怎样才能找到局部变量的运行时当前值,例如通过它的索引?有可能做到ASM
吗?还有什么办法?显然这些数据在相关的堆栈帧中更新了,但是我怎样才能访问它呢?
这是我到目前为止的一般方法:
java - java.lang.VerifyError:堆栈映射与异常处理程序中的不匹配
在 JVM 加载字节码期间,遇到了带有如下代码片段的 java.lang.VerifyError。
这里 CalculationException 是扩展 java.lang.RuntimeException 的自定义异常,而 NumberFormatException 是标准的 Java RuntimeException。虽然代码在本地 Windows 机器上编译和运行良好。
它在 QA/prod/Dev unix 节点之一上因 VerifyError 而失败,并且在其他 unix 节点上工作正常。虽然两个 unix 节点具有相同的配置(使用 RedHat 6.2 和 1.8 jdk 以及相同版本的 jar 文件),但也比较了 javap -c 在两个节点上生成的字节码,发现相同。
我还发现了两种在错误节点上解决此问题的方法。
1)由于此错误出现在字节码验证步骤中,因此尝试通过禁用 dev unix 框上的字节码验证为 -Xverify:none (也尝试了 -XX:-UseSplitVerifier 但 dint 工作,因为我认为它从 jdk 8 禁用)但是,由于我们不会在 prod 中禁用字节码验证,因此一直在寻找其他解决方法。
2) 另一种解决方法是使用父异常:在 catch 块中使用 RuntimeException 而不是组合两个异常。
如果 Java 确实存在这种捕获方式的问题,我无法理解为什么编译器会抱怨它以及为什么它可以在一台机器上运行而不是在其他具有相同配置的机器上运行。错误原因也没有意义,它说: CalculationException (current frame, stack[0]) is not assignable to 'java/lang/RuntimeException 虽然它实际上是可分配的,经测试
完整的异常详细信息: 位置: