gpt4 book ai didi

java - 替换Java中的静态引用方法

转载 作者:搜寻专家 更新时间:2023-11-01 03:26:47 25 4
gpt4 key购买 nike

我有一个像下面这样的类,它的方法只返回一个字符串,但我想修改它从另一个类返回的内容,而不是自己硬编码。

public class Name {
public static String getName() {
return "MyName";
}
}

有什么办法吗?我尝试了 BCEL,但这似乎并没有改变返回值。

编辑:这是一个模组。我试图通过不修改它来使其完全独立于现有代码。

谢谢。

最佳答案

确定您已经尝试过 BCEL 吗?我创建了一个完整的示例 here .

JavaClass target;
try {
target = Repository.lookupClass("Target");
} catch (final ClassNotFoundException ex) {
throw new RuntimeException("unable to resolve Target", ex);
}
final ClassGen targetGen = new ClassGen(target);
final ConstantPoolGen pool = targetGen.getConstantPool();
final ConstantMethodref ref = (ConstantMethodref) pool.getConstant(
pool.lookupMethodref("Name", "getName", "()Ljava/lang/String;"));
ref.setClassIndex(pool.lookupClass("Target"));
ref.setNameAndTypeIndex(pool.addNameAndType("$Name$getName", "()Ljava/lang/String;"));
final InstructionList code = new InstructionList();
final InstructionFactory factory = new InstructionFactory(targetGen, pool);
code.append(factory.createConstant("overriden-name"));
code.append(factory.createReturn(Type.STRING));
code.setPositions();
final MethodGen methodGen = new MethodGen(
Constants.ACC_PRIVATE | Constants.ACC_SYNTHETIC | Constants.ACC_STATIC,
Type.STRING, new Type[0], new String[0], "$Name$getName", "Target",
code, pool);
methodGen.setMaxLocals(0);
methodGen.setMaxStack(1);
targetGen.addMethod(methodGen.getMethod());
try {
targetGen.getJavaClass().dump("Target.class");
} catch (final IOException ex) {
throw new RuntimeException("unable to save Target", ex);
}
C:\dev\scrap>javac Target.java
C:\dev\scrap>java Target
original-name
C:\dev\scrap>javac -cp .;bcel-6.0.jar Instrumenter.java
C:\dev\scrap>java -cp .;bcel-6.0.jar Instrumenter
C:\dev\scrap>java Target
overriden-name

关于java - 替换Java中的静态引用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12119720/

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