检测所有GETSTATIC和PUTSTATIC字节码指令

时间:2016-10-26 12:22:33

标签: java instrumentation java-bytecode-asm javassist

我需要在某些类中检测所有getstaticputstatic字节码指令。 我知道Java代理的基础知识,我正在寻找的是一个允许在源代码级添加工具代码的框架。所以我想用普通的java代码而不是手写字节码来检测指令。 我已经看到Javassist有这个功能,但不是字节码级别的工具。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

在Javassist中,这有点乏味。基本上,您需要迭代方法的代码:

ClassPool classPool = ...
for (Object method : managedCtClass.getClassFile().getMethods()) {
  MethodInfo methodInfo = (MethodInfo) oMethod;
  if (methodInfo.getCodeAttribute() == null) {
    continue;
  }
  CodeIterator iterator = methodInfo.getCodeAttribute().iterator();
  while (iterator.hasNext()) {
    int index = iterator.next();
    int opcode = iterator.byteAt(index);
    if (opcode != Opcode.PUTFIELD && opcode != Opcode.GETFIELD) {
      continue;
    }
    // manually adjust the byte code by itr.writeXXX methods.
  }
  methodInfo.getCodeAttribute().setAttribute(MapMaker.make(classPool, methodInfo));
}

确保在更改字节代码后,需要在完成对所有代码元素的迭代后替换该属性。