Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将代码注入被重写的方法(Java)_Java_Minecraft - Fatal编程技术网

将代码注入被重写的方法(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您可能应该在您的问题中写下这一点。。。。