如果不存在是因为字节伙伴针对方法委托域,那么我可以提供一个需要此功能的方案:

private Object invokeSpi(Object spi, Object... params) {
    Reducer reducer = (Reducer) spi;
    return reducer.reduce((Integer) params[0], (Integer) params[8]);
}


上面的代码将为down转换语句生成ASTORE指令。

最佳答案

字节伙伴提供了不同的Instrumentation实现,这些实现均由提到的StackManipulation组成。但是,没有任何预构建的仪器需要ASTORE指令,这就是为什么不对其进行预定义的原因。但是,您可以为此轻松实现自己的实现:

class AStrore implements StackManipulation {

  private final int index; // Constructor omitted

  public boolean isValid() {
    return index >= 0;
  }

  public Size apply(MethodVisitor methodVisitor, Instrumentation.Context context) {
    methodVisitor.visitIntInsn(Opcodes.ASTORE, index);
    return new Size(-1, 0);
  }
}


但是请注意,然后您将直接使用ASM,这会遇到兼容性问题。因此,请阅读information on Byte Buddy's website有关如何将ASM和Byte Buddy重新打包到您自己的名称空间中的。

还请注意,可以通过在调用之前直接强制转换实例来避免ASTORE指令。

10-01 12:39