将代码注入被重写的方法(Java)
我有这个:将代码注入被重写的方法(Java),java,minecraft,Java,Minecraft,我有这个: public class Superclass { public int getMaxLevel() { return 1; } } public class Subclass extends Superclass { public int getMaxLevel() { return 4; } } 我需要的是: public class Superclass { public int getMaxLevel() { return 3;
public class Superclass {
public int getMaxLevel() {
return 1;
}
}
public class Subclass extends Superclass {
public int getMaxLevel() {
return 4;
}
}
我需要的是:
public class Superclass {
public int getMaxLevel() {
return 3; //injected
//return 1; //original
}
}
public class Subclass extends Superclass {
public int getMaxLevel() {
return 3; //injected
//return 4; //original
}
}
超类和子类都在库中。另外,由于我的用例是Minecraft mod,我的目标是兼容性,所以它需要在超类中完成,而不是在子类中完成
我更喜欢只使用Java的答案(不需要外部库)
编辑:使用的Modding框架是Forge 1.16.5,我没有访问所有子类的权限(因此可能有额外的类扩展超类),这就是为什么需要在超类中执行注入。您没有提到正在使用的Modding工具链,但如果是Fabric或Forge 1.16.5,则
Mixin
字节码编织框架将允许您完成所需的工作。阅读fabric wiki上的更多信息
@Mixin(Superclass.class)
public class SuperclassMixin {
@Inject(method = "getMaxLevel", at = @At("RETURN"), cancellable = true)
public int getMaxLevelReturnInject(CallbackInfoReturnable<Integer> ci) {
ci.setReturnValue(3);
}
}
@Mixin(超类.class)
公共类超类mixin{
@注入(method=“getMaxLevel”,at=@at(“RETURN”),cancelable=true)
public int getMaxLevelReturnInject(CallbackInfoReturnable ci){
ci.setReturnValue(3);
}
}
对子类重复上述操作。首先,我使用的是Forge 1.16.5。第二,这是我到现在为止的解决方案,但它不起作用,因为我不想在子类中这样做。这就是问题的关键所在。没有子类编辑,因为我无法获得所有子类。(除了有一种在运行时创建mixin的方法吗?@IchHabeHunger54您可能应该在您的问题中写下这一点。。。。