2013-04-02 100 views
0

我只是在想,我想知道:因爲訪問控制只是爲了防止意外而不是防止欺詐,我想知道是否有可能訪問Java中隱藏變量的值?私人訪問控制

就拿

public Cat { 

public int numberOfLegs = 4; 
private int numberOfWhiskers = 42; 

} 

是否有可能找到這個類的外numberOfWhiskers的價值?

編輯:我已閱讀鏈接中的線程,我可以看到通過使用SetAccesible()可以獲取任何私有字段的值,您知道該名稱。 我們可以找到我們不知道名稱的字段的值嗎?

注意:這個可以可以在一些語言如C++中完成,例如通過使用遍歷類中的字段的指針。

+0

我有點不同意你的前提。事實上,Java設計用於支持VM中運行的不可信代碼的保護。這就是安全管理器和安全模型的設計目的。訪問控制是安全模型的組成部分,並且在運行時驗證,它們不僅僅在編譯期間使用。 –

回答

3

您可以使用反射繞過private檢查。使用Class#getDeclaredField方法和Field#getInt方法(還有其他訪問器)。

該代碼可以在其他類:

Cat myCat = new Cat(); 
int whiskers; 

try 
{ 
    Field field = Cat.class.getDeclaredField("numberOfWhiskers"); 
    // This line bypasses the private control 
    field.setAccessible(true); 
    whiskers = field.getInt(myCat); 
} 
catch (NoSuchFieldException e) { /* Handle */ } 
catch (IllegalAccessException e) { /* Handle */ } 

編輯

我見過的鏈接重複的問題。我必須同意,通常情況下,不要這樣做。

第二個編輯

爲了應對額外的編輯問題,你可以使用Class#getDeclaredFields方法返回一個Field[]與您可以用它來在迭代類的所有領域。

Field[] fields = Cat.class.getDeclaredFields(); 
// Iterate over the array here.