gpt4 book ai didi

java - 在字节码中使用 BCEL 将方法添加到类中的特定行

转载 作者:行者123 更新时间:2023-12-01 13:55:36 27 4
gpt4 key购买 nike

我是操作 Java 字节码的 BCEL 新手。我需要使用 BCEL 将新方法插入 .class 文件中的特定行。结果应该是一个新的 .class 文件,其中包含具有新插入方法的类。

我在网上搜索了很多,但找不到合适的代码可以遵循。你能帮我解决这个问题吗?

提前致谢!

最佳答案

我用 GeekyArticles 来搞清楚 BCEL,也许它对你有帮助? http://www.geekyarticles.com/search/label/BCEL

无论如何,以下代码对我有用(Java 1.7)

测试.java:

public class Test {}

AddMain.java:

import java.io.IOException;
import org.apache.bcel.classfile.*;
import org.apache.bcel.generic.*;
import org.apache.bcel.*;

public class AddMain {

static public void main(String args[]) {
String className = (args.length >= 1) ? args[0] : "";
JavaClass mod = null;
try {
mod = Repository.lookupClass(className);
}
catch (Exception e) {
System.err.println("Could not get class " + className);
}

ClassGen modClass = new ClassGen(mod);
ConstantPoolGen cp = modClass.getConstantPool();

InstructionList il = new InstructionList();

il.append(new GETSTATIC(cp.addFieldref("java.lang.System","out","Ljava/io/PrintStream;")));
il.append(new PUSH(cp, "Hello World!"));
il.append(new INVOKEVIRTUAL(cp.addMethodref("java.io.PrintStream","println","(Ljava/lang/String;)V")));
il.append(new RETURN());

MethodGen methodGen = new MethodGen(
Constants.ACC_PUBLIC|Constants.ACC_STATIC,
Type.VOID,
new Type[]{new ArrayType(Type.STRING, 1)},
new String[]{"args"},
"main",
className,
il,
cp);

methodGen.setMaxLocals();
methodGen.setMaxStack();

modClass.addMethod(methodGen.getMethod());
modClass.update();

try {
JavaClass newClass = modClass.getJavaClass();
String className2 = className.replace(".","/");
newClass.dump(className2 + ".class");
System.out.println("Class " + className + " modified");
}
catch (IOException e) {
e.printStackTrace();
}
}
}

然后在终端中使用这些命令:

生成AddMain.class:

javac -cp bcel-5.2.jar:. AddMain.java; 

生成测试.class:

javac Test.java; 

在类 Test.class 中注入(inject)名为“main”的方法:

java -cp bcel-5.2.jar:. AddMain Test; 

运行Test.class进行测试:

java Test

当然,请确保该目录中也有 bcel-5.2.jar 文件。

据我所知,你无法控制注入(inject)方法的位置,但我不确定......

关于java - 在字节码中使用 BCEL 将方法添加到类中的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19651955/

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