Java 修改受保护方法中的代码

Java 修改受保护方法中的代码,java,protected,Java,Protected,我想知道是否有可能覆盖第三方jar文件中的受保护方法。我猜我可以使用反射调用该方法,但是我如何完全覆盖它呢 方法是 protected void a(World world, int i, int j, int k, ItemStack itemstack) { if (!world.isStatic && world.getGameRules().getBoolean("doTileDrops")) { float f = 0.7F; d

我想知道是否有可能覆盖第三方jar文件中的受保护方法。我猜我可以使用反射调用该方法,但是我如何完全覆盖它呢

方法是

protected void a(World world, int i, int j, int k, ItemStack itemstack) {
    if (!world.isStatic && world.getGameRules().getBoolean("doTileDrops")) {
        float f = 0.7F;
        double d0 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
        double d1 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
        double d2 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
        EntityItem entityitem = new EntityItem(world, (double) i + d0, (double) j + d1, (double) k + d2, itemstack);
        entityitem.pickupDelay = 10;
        world.addEntity(entityitem);
    }
}

是的,
protected
方法的要点是,它们可以被不同包/模块中的子类实现覆盖(默认访问模式只允许从同一包中进行覆盖)

然后由子类决定是否要回调超级方法

所以你本来可以

class MyVersion extends TheClass {

     @Override
     protected void a(World world, int i, int j, int k, ItemStack itemstack) {
         // do something else
     }

}

当然,更有趣的问题是如何使应用程序的其余部分使用新版本而不是原始版本。如果是您的代码驱动这个对象的实例化,那么这是没有问题的。否则,您可能必须找到一些配置设置或更改更多的代码。

如果您从受保护的方法所属的类继承,您可以在自己的包之外重写受保护的方法。。如果它是受保护的方法,则可以通过扩展类来重写它。检查我知道我可以覆盖它,但我不知道如何让其他插件使用覆盖的方法。应该是“相同”的包。是的,我认为这会起作用,但我不知道如何强制所有附加的东西使用我的版本,这就是为什么我希望在服务器启动时覆盖它,这样当其他插件访问该方法时,它就会使用新的方法。你可能需要用补丁版本替换jar文件。没有更多细节很难说。这是我想到的路线,但如果可能的话,我真的很想避免。真的没有别的办法吗?是否可以查看原始方法何时运行、拦截、取消并运行新方法?