有没有办法在 JVM 堆栈上交换长(或双)和参考值?

Is there a way to swap long (or double) and reference values on JVM stack?

假设我有以下字节码序列

aload 0 // this
lload 1
aload 3

为了这个问题,我们假设这些指令是由其他代码生成的,我无法控制它。

我需要交换堆栈中的最后两项,一个 long 和一个 reference。我不能用 swap 来做到这一点,因为 long 在堆栈上占用两个位置,而 swap 不关心那个。

加载 class 时我会得到这样的东西:

java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    bytecode/generated/SomeClasName.someMethod(Ljava/lang/Object;)Z @18: swap
  Reason:
    Type long_2nd (current frame, stack[3]) is not assignable to category1 type

有没有办法在不求助于局部变量的情况下交换堆栈上的类别 1 和类别 2 类型?

使用 dup_x2 + pop.

虽然这需要一个额外的堆栈槽。