2014-12-02 64 views
0

我想知道是否有可能重寫第三方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); 
    } 
} 
+0

如果從屬於它的類繼承,則可以在自己的包外部「覆蓋」受保護的方法。 – 2014-12-02 05:44:58

+1

我沒有收到您的問題。如果它是受保護的方法,則可以通過擴展該類來覆蓋它。檢查[Java Access Modifiiers](http://www.tutorialspoint.com/java/java_access_modifiers.htm) – Vikas 2014-12-02 05:45:51

+0

我知道我可以覆蓋它,但我不知道如何讓其他插件使用重寫的方法。 – 97WaterPolo 2014-12-02 06:01:23

回答

0

是的,protected方法的一點是,它們可通過在不同的包中的子類實現覆蓋/模塊(默認訪問模式允許這樣做只從同一個包) 。

然後由子類決定是否要回調超級方法。

所以你可以有

當然,更有趣的問題是如何使應用程序的其他部分使用,而不是原來的新版本。如果它是驅動實例化此對象的代碼,那麼這沒有問題。否則,您可能需要找到一些配置設置或更改一些代碼。

+0

應該是'相同'包。 – Mavlarn 2014-12-02 05:46:07

+0

是的,我想這會工作,但我不知道如何強制所有附加使用我的版本,這就是爲什麼我有點希望覆蓋它,而服務器本身啓動,所以當其他插件訪問該方法時,它會使用新的。 – 97WaterPolo 2014-12-02 05:58:22

+0

您可能需要將jar文件替換爲修補版本。很難說沒有更多的細節。 – Thilo 2014-12-02 06:00:44