我需要在某些类中检测所有getstatic
和putstatic
字节码指令。
我知道Java代理的基础知识,我正在寻找的是一个允许在源代码级添加工具代码的框架。所以我想用普通的java代码而不是手写字节码来检测指令。
我已经看到Javassist有这个功能,但不是字节码级别的工具。
有人可以帮忙吗?
答案 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));
}
确保在更改字节代码后,需要在完成对所有代码元素的迭代后替换该属性。