gpt4 book ai didi

java - 使用 javassist 更改方法体的一部分

转载 作者:行者123 更新时间:2023-11-30 04:39:58 24 4
gpt4 key购买 nike

让我首先解释一下我的目标...我需要更改方法主体的部分,我的意思是,在方法内部我有多个调用,但只需将其中一个调用更改为使用两个参数而不是仅 1 个。因为我想在方法中保持所有其余参数相同,所以我想获取方法主体,通过正则表达式更改此特定调用,我想更改并再次将其设置回来。

假设这是一个好方法......我怎样才能获得方法体?

任何建议将不胜感激

谢谢

拉斐尔·莫伊塔

最佳答案

今天我必须对类的静态初始值设定项进行一些修改,这可以使用 Javaasist 来完成。但这很难。您至少需要了解一些有关 java 字节码生成/处理的知识(编译后不再有源代码)。

您可能会发现这个维基百科页面很有用:http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings 。它包含所有 Java 字节代码指令的列表、它们采用的参数以及它们在堆栈上执行的操作。

这是代码(Groovy,但应该很容易翻译成 Java)。它的作用是遍历静态类初始值设定项的字节码,并删除先前在字节码中重命名的静态 oldFieldName 的所有赋值指令。希望您觉得它有用。

def oldFieldName = "removedField"
def cp = ClassPool.getDefault()
//Create new class out of name and bytes
cp.insertClassPath(new ByteArrayClassPath(name, bytes))

def initializer = cc.classInitializer;
def mi = initializer.getMethodInfo();
def ca = mi.getCodeAttribute();

def ci = ca.iterator()
//Let's check all bytecode operations in static initializer
while (ci.hasNext()) {
def index = ci.next()
int op = ci.byteAt(index)
//PUTSTATIC is a bytecode instruction to assign value from stack to static variable
if (op == Opcode.PUTSTATIC) {
//Address of target variable is calculated like this
def targetFieldAddr = (ci.byteAt(index + 1) << 8) + ci.byteAt(index + 2)
def fieldrefName = mi.getConstPool().getFieldrefName(targetFieldAddr)
if (fieldrefName == oldFieldName) {
//Ok, so it's an assignment to renamed variable
//Let's change assignemt to pop from stack (POP2 -> pop long/double value)
//We have to remove it or stack won't be valid
ci.writeByte((byte) Opcode.POP2, index);
//PUTSTATIC takes 2 arguments so we have to cleare them out
//or they will be used as bytecode instructions and probably invalidate class
ci.writeByte((byte) Opcode.NOP, index + 1);
ci.writeByte((byte) Opcode.NOP, index + 2);
}
}

cc.defrost()
cc.detach()

另一个提示:在修改之前使用JDK中的javap工具反汇编已编译的类,并与生成的字节码进行比较。通过这种方式更容易发现错误。您还可以找到要以这种方式修改的字节码指令。

关于java - 使用 javassist 更改方法体的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12533588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com