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

I have a class like below with a method that just returns a String, but I want to modify what it returns from another class, without hardcoding it myself.

public class Name {

public static String getName() {

return "MyName";

}

}

Is there any way to do this? I tried BCEL but that didn't seem to change the return value.

Edit: This is for a mod. I'm trying to make it completely independant from the existing code, by not modifying it.

Thanks.

解决方案

Are you sure you've tried BCEL? I created a fully-working example 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值