【问题标题】:Modifying code within a protected method在受保护的方法中修改代码
【发布时间】:2014-12-02 05:40:36
【问题描述】:

我想知道是否可以覆盖第 3 方 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);
    }
}

【问题讨论】:

  • 如果你继承自它所属的类,你可以在你自己的包之外overrideprotected方法。
  • 我没有得到你的问题。如果它是受保护的方法,您可以通过扩展类来覆盖它。检查Java Access Modifiiers
  • 我知道我可以覆盖它,但我不知道如何让其他插件使用覆盖的方法。

标签: java protected


【解决方案1】:

是的,protected 方法的意义在于它们可以被不同包/模块中的子类实现覆盖(默认访问模式只允许从同一个包中执行此操作)。

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

所以你可以拥有

class MyVersion extends TheClass {

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

}

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

【讨论】:

  • 应该是“相同”的包。
  • 是的,我认为这可行,但我不知道如何强制所有其他附加的东西使用我的版本,这就是为什么我有点希望在服务器本身启动时覆盖它所以当其他插件访问该方法时,它将使用新的。
  • 您可能需要将 jar 文件替换为补丁版本。没有更多细节很难说。
  • 这是我想到的一条路线,但如果可能的话,我真的很想避免。真的没有别的办法了吗?是否可以查看原始方法何时运行,拦截它,取消它,然后运行新方法?
猜你喜欢
  • 1970-01-01
  • 2014-12-29
  • 2020-03-31
  • 2011-04-05
  • 2016-02-19
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多