问题标签 [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.
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 方法名称由计算方法名称和输入参数的签名标识。更改输出参数不会更改方法的名称
java - 从 lambda 对象获取 MethodHandle
来自java.lang.invoke.LambdaMetafactory
:
评估 lambda 表达式的推荐机制是将 lambda 主体脱糖为方法,调用其静态参数列表描述功能接口的唯一方法和脱糖实现方法的 invokedynamic 调用站点,并返回一个对象(lambda 对象)实现目标类型。
从检查来看,这至少是 Oracle JDK 所做的。
我的问题:给定一个 lambda 对象,有没有办法找到实现方法的名称(或句柄)?或者,给定一个实现方法列表,有没有办法判断哪个对应于给定的 lambda 对象?
string - Jasmin ByteCode 存储字符串
我正在尝试在 Jasmin 字节码中存储一个字符串。经过大量的研究,我找不到这是否可行,如果可行,应该怎么做。我只能找出如何打印出来(这就是我打印字符串的方式)。我还想过将字符串存储为字符数组,但认为应该有一种更简单的方法。
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 个
谢谢你。
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[]。
谁能解释这背后的理由?
algorithm - Jasmin 中的 Butchers 算法
我不断收到错误,我似乎一直在尝试打印它。我已经查找了有关 Jasmin 的信息,据我所知,确实没有很多信息。对我的代码的任何帮助将不胜感激。在复活节的下一个 10 年,我应该使用 Butchers 算法在命令行上使用 Jasmin 进行打印。我的大部分问题都在本月的印刷和下面的我的代码中......
所以我发现它在这里
kotlin - Kotlin 内联扩展属性
我知道inline关键字意味着避免调用函数的调用开销。但我不知道内联扩展属性的作用是什么?
假设我们有两个名为foo的扩展属性和另一个名为bar的内联属性
执行它们中的任何一个,我们都会得到预期的输出,即当前时间。
该文件的字节码如下:
我们可以看到两者相似但仅在以下几行上有所不同:
foo提取物:
酒吧提取物:
我真的不明白这里发生了什么。有人可以指出我的行为是什么,或者java中的等价物,或者对此有什么用处?
编辑
鉴于编译器将替换内联属性的内容,是否可以方便地内联每个没有繁重操作的扩展属性?
谢谢
java - 将枚举器添加到 Java 枚举中会破坏 ABI 吗?
例如,在我的代码中有
我稍后添加颜色,即
这会破坏 ABI 吗?也就是说,我的用户是否需要重新编译他的 Java 类?
java - 如何访问 JVM 操作数栈
我正在编写一个需要访问操作数堆栈的 Java 调试器。
基本上,我正在尝试使用 JPDA ( https://docs.oracle.com/javase/7/docs/technotes/guides/jpda/index.html ) 记录 Java 程序的执行跟踪。对于每个跟踪步骤,我想检索读/写的变量。对于应用程序代码,我可以分析变量表达式(例如,a[i])以获取其运行时值。尽管如此,当Java程序运行到库字节码(没有源代码)时,我只能知道Java字节码在运行什么(例如aaload),这使得用JPDA很难得到它的运行值。
有谁知道检索 Java 操作数堆栈中的值?谢谢!