java - 为什么Byte Buddy缺少与操作码ASTORE对应的StackManipulation实现?

标签 java bytecode byte-buddy

如果它的缺失是因为byte-buddy针对的是方法委托(delegate)域,那么我可以提供一个需要这个特性的场景:

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 组成的。但是,没有预构建的检测需要 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 指令。

关于java - 为什么Byte Buddy缺少与操作码ASTORE对应的StackManipulation实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25803481/

相关文章:

java - ByteBuddy rebase 、合成类型和 OSGi

java - 告诉bytebuddy到 "not care"关于通用信息

java - 如何使用 spring mvc void Controller 方法?

java - 我的 switch 语句中的 case 不会结束

java:使用 hashmap 或其他一些 java 集合创建查找表?

java - 将小部件添加到面板的第一个位置?

java - 你能在运行时检查 Java 8 lambda 的字节码吗?

java - 如何从 Java 字节码中判断局部变量是否为 'final'? (与BCEL相关)

java - 如何使用 javaassist 或任何其他 api 获取所有方法的正确行号?

java - 创建 jdbc 连接的动态代理以覆盖提交或回滚方法