问题标签 [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 投票
1 回答
92 浏览

java - 我可以使用子接口重新编译公共 API 并保持二进制兼容性吗?

我有一个公共 API,在多个项目中多次使用:

以及一个负责实现 Future 机制的抽象类(未显示)。我知道所有项目都是相应抽象类的子类(对于它 performAsync 是final),并且没有一个类在没有抽象实现者的子类的情况下实现抽象接口。这是设计使然,因为这个“公共”API 在我们公司内部是“公共的”。

与 Spring 相比,发现这Future太有限了,ListenableFuture我决定将接口扩展到

而且我已经在示例中未显示的单个抽象超类中实现了 ListenableFuture。根据设计,不存在其他实现。

到目前为止,每个调用者都Future使用ListenableFuture. 如果您使用Future<?> future = processReturningListenable.performAsync(context).

问题是:如果我部署了公共 API 的最新 JAR,包含接口和抽象超类,并ListenableFuture在现有环境中实现,而不重新编译所有项目performAsync调用是否仍然有效?

即当接口被替换为返回原始类型的子类型的方法时,Java 是否授予接口的二进制兼容性?

我问这个是因为 1)我发现没有人可以使用现有的 JAR 文件进行简单测试,并且 2)必须重新编译所有项目是一个红色警报。

我假设我的要求是可能的,因为 Java 方法名称由计算方法名称和输入参数的签名标识。更改输出参数不会更改方法的名称

0 投票
1 回答
786 浏览

java - 从 lambda 对象获取 MethodHandle

来自java.lang.invoke.LambdaMetafactory

评估 lambda 表达式的推荐机制是将 lambda 主体脱糖为方法,调用其静态参数列表描述功能接口的唯一方法和脱糖实现方法的 invokedynamic 调用站点,并返回一个对象(lambda 对象)实现目标类型。

从检查来看,这至少是 Oracle JDK 所做的。

我的问题:给定一个 lambda 对象,有没有办法找到实现方法的名称(或句柄)?或者,给定一个实现方法列表,有没有办法判断哪个对应于给定的 lambda 对象?

0 投票
2 回答
1002 浏览

string - Jasmin ByteCode 存储字符串

我正在尝试在 Jasmin 字节码中存储一个字符串。经过大量的研究,我找不到这是否可行,如果可行,应该怎么做。我只能找出如何打印出来(这就是我打印字符串的方式)。我还想过将字符串存储为字符数组,但认为应该有一种更简单的方法。

0 投票
2 回答
2019 浏览

java - 禁用 Java 字节码验证会导致哪些问题?

这个答案说验证用于确保 Java 字节码“遵循 Java 语言安全规则”。

如果不执行此验证,将允许运行不安全的字节码。这会导致什么问题?

是否存在可以接受禁用字节码验证的情况?

0 投票
1 回答
596 浏览

java - 如何按字节数组加载jar的整个类?

我正在尝试将一个类加载到一个字节数组中。MainC、Loader、ClassByte、byteClassLoader都是用来加载类的。

MainC 是起点。

这里我们加载类并调用方法。

在这里,我们可以获取要加载的类和字节数组。

带字节的 ClassLoader

现在下面是我要执行的课程。

Startclass 的 startmethod() 是起点。




但这里有例外。




在sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)在 sun.reflect.NativeMethodAccessorImpl.invoke0
(Native Method)在 sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 a.Loader.load(Loader.java:12) 在 a.MainC.main(MainC.java:10) 引起作者:java.lang.ClassFormatError: 在 java.lang.ClassLoader.defineClass(ClassLoader.java:763) 处的 java.lang.ClassLoader.defineClass1(Native Method)处的类文件被截断










在 a.byteClassLoader.findClass(byteClassLoader.java:38)
在 a.byteClassLoader.loadClass(byteClassLoader.java:17)
在 abStartclass.startmethod(Startclass.java:7)
... 还有 6 个

谢谢你。

0 投票
1 回答
120 浏览

java - Java 8:验证字节码时将 String[] 和 int[] 合并到 Object[] 中

我正在阅读 JVM 版本 8 ( https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html ) 规范的第 4.10.2.2 节如何验证字节码。在这种情况下,控制流中会发生什么,当堆栈现在包含一个插槽时,当来自一个来源时,它带有一个 int[],而当来自另一个来源时,它是一个 String[]。

我阅读了以下内容,这在 JVM 版本 7 文档中不存在:

如果对应的值都是数组引用类型,则检查它们的维度。如果数组类型具有相同的维度,则合并值是对数组类型实例的引用,该实例是两种数组类型的第一个公共超类型。(如果其中一个或两个数组类型具有原始元素类型,则使用 Object 作为元素类型。)

...

甚至 int[] 和 String[] 也可以合并;结果是 Object[],因为在计算第一个公共超类型时使用 Object 而不是 int。

这对我来说没有任何意义,因为这意味着 int[] 可以转换为 Object[]。但是在 Java 中,原始类型的数组不能转换为 Object[]。

谁能解释这背后的理由?

0 投票
0 回答
150 浏览

algorithm - Jasmin 中的 Butchers 算法

我不断收到错误,我似乎一直在尝试打印它。我已经查找了有关 Jasmin 的信息,据我所知,确实没有很多信息。对我的代码的任何帮助将不胜感激。在复活节的下一个 10 年,我应该使用 Butchers 算法在命令行上使用 Jasmin 进行打印。我的大部分问题都在本月的印刷和下面的我的代码中......

所以我发现它在这里

0 投票
1 回答
3118 浏览

kotlin - Kotlin 内联扩展属性

我知道inline关键字意味着避免调用函数的调用开销。但我不知道内联扩展属性的作用是什么?

假设我们有两个名为foo的扩展属性和另一个名为bar的内联属性

执行它们中的任何一个,我们都会得到预期的输出,即当前时间。

该文件的字节码如下:

我们可以看到两者相似但仅在以下几行上有所不同:

foo提取物:

酒吧提取物:

我真的不明白这里发生了什么。有人可以指出我的行为是什么,或者java中的等价物,或者对此有什么用处?

编辑

鉴于编译器将替换内联属性的内容,是否可以方便地内联每个没有繁重操作的扩展属性?

谢谢

0 投票
1 回答
96 浏览

java - 将枚举器添加到 Java 枚举中会破坏 ABI 吗?

例如,在我的代码中有

我稍后添加颜色,即

这会破坏 ABI 吗?也就是说,我的用户是否需要重新编译他的 Java 类?

0 投票
0 回答
291 浏览

java - 如何访问 JVM 操作数栈

我正在编写一个需要访问操作数堆栈的 Java 调试器。

基本上,我正在尝试使用 JPDA ( https://docs.oracle.com/javase/7/docs/technotes/guides/jpda/index.html ) 记录 Java 程序的执行跟踪。对于每个跟踪步骤,我想检索读/写的变量。对于应用程序代码,我可以分析变量表达式(例如,a[i])以获取其运行时值。尽管如此,当Java程序运行到库字节码(没有源代码)时,我只能知道Java字节码在运行什么(例如aaload),这使得用JPDA很难得到它的运行值。

有谁知道检索 Java 操作数堆栈中的值?谢谢!