2016-01-17 33 views
2

我知道這肯定不是一個好習慣,但是Java是否提供了任何機制來阻止訪問包私有方法/屬性?如果不是,那是不是這個意思:將我的課程放到其他人的包中以訪問包可見方法?

package com.other_people_other_company; 

public class MyClass { 
    // Let's hack! Access all package privates 
} 

有效嗎?

編輯:

它在答覆中提到:

Name: myCompany/myPackage/ 
Sealed: true 

這是我的新信息。但是如果我通過散發一罐礦泉水來破壞並在那裏密封其他人的包裹呢?例如。 Name: org.apache Sealed: true

+0

你試過了,你能做到嗎? – Sandeep

回答

0

是的,的確如此。在這個想法中,某種「補丁」方法的基礎是:當你必須修復3D方庫中的一些錯誤時,你可以在你的類路徑中創建具有相同類的相同包並創建固定類。

唯一的一個限制是特殊的軟件包名稱,例如java.util,例如,通過添加以下行

package java.util; 

public class TestTripwire { 
    public static void main(String[] args) { 
     Tripwire.trip(Object.class, "sss"); 
    } 
} 

但是,如果你運行它,你會得到異常Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util

+0

我得到了第一點,它通常確實有可能用於創建補丁。對於某些軟件包被「禁止」的第二部分,您是否有任何參考/ JLS部分?它看起來不那麼整潔或標準。 – Boyang

2

假設.JAR分佈,可以seal the packages:這個例子可以編譯成功,但java.util.Tripwire類有包本地訪問修飾符到META-INF/MANIFEST.MF

Name: myCompany/myPackage/ 
Sealed: true 

的幾個注意事項:

  • 每個軟件包都需要自己的條目。
  • 這並不能防止狡猾的人從清單文件中刪除行並在內部重新分發它。如果這是一個問題,您可能需要查看一些自我驗證技巧,例如在密封包中強制類來檢查清單是否未被觸及。
+0

這是我的新信息。但是如果我通過散發一罐礦泉水來破壞並在那裏密封其他人的包裹呢?例如。 'Name:org.apache Sealed:true' – Boyang

+0

@Charles,由於這個確切原因,系統遠非完美。我相信Java 9的模塊系統將解決這個特定的問題,但我還沒有以這種方式對它進行研究,我可以肯定地說。 – Esko

相關問題