3

如果它的缺失是因为 byte-buddy 针对方法委托域,那么我可以提供一个需要此功能的场景:

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

上面的代码将为向下转换语句生成一条 ASTORE 指令。

4

2 回答 2

2

Byte Buddy 提供了不同Instrumentation的实现,这些实现都是由上述StackManipulations 组成的。但是,没有预建的仪器需要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。为此,请阅读Byte Buddy 网站上有关如何将 ASM 和 Byte Buddy 重新打包到自己的命名空间中的信息。

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

于 2014-09-13T10:17:14.847 回答
1

我正在使用 ByteBuddy 版本1.7.3,在该版本中ALOADASTORE操作以及其他相关操作可以在net.bytebuddy.implementation.bytecode.member.MethodVariableAccess. 在这里查看 Javadoc

于 2017-08-28T14:13:34.187 回答