如果不存在是因为字节伙伴针对方法委托域,那么我可以提供一个需要此功能的方案:
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
指令。