如果它的缺失是因为 byte-buddy 针对方法委托域,那么我可以提供一个需要此功能的场景:
private Object invokeSpi(Object spi, Object... params) {
Reducer reducer = (Reducer) spi;
return reducer.reduce((Integer) params[0], (Integer) params[8]);
}
上面的代码将为向下转换语句生成一条 ASTORE 指令。
如果它的缺失是因为 byte-buddy 针对方法委托域,那么我可以提供一个需要此功能的场景:
private Object invokeSpi(Object spi, Object... params) {
Reducer reducer = (Reducer) spi;
return reducer.reduce((Integer) params[0], (Integer) params[8]);
}
上面的代码将为向下转换语句生成一条 ASTORE 指令。
Byte Buddy 提供了不同Instrumentation
的实现,这些实现都是由上述StackManipulation
s 组成的。但是,没有预建的仪器需要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
通过在调用之前直接转换实例来避免该指令。
我正在使用 ByteBuddy 版本1.7.3
,在该版本中ALOAD
,ASTORE
操作以及其他相关操作可以在net.bytebuddy.implementation.bytecode.member.MethodVariableAccess
. 在这里查看 Javadoc