2013-09-21 101 views
2

我試圖學習反思和我在整個問題,爲什麼沒有例外?爲什麼沒有illegalAccessException使用反射

public class FieldExceptionTest { 
    private boolean b = true; 

    public static void main(String[] args) throws Exception{ 
     FieldExceptionTest ft = new FieldExceptionTest(); 
     Class<?> c = ft.getClass(); 
     Field f = c.getDeclaredField("b"); 
     // f.setAccessible(true); //if i don't write this line, it also can run. 
     f.setBoolean(ft, Boolean.FALSE); 
     System.out.println(ft.b); 
    } 
} 

爲什麼不拋出IllegalAccessException?通過閱讀其他書,我知道如果嘗試獲取或設置私有或其他不可訪問的字段的值或設置最終字段的值,則可能會拋出IllegalAccessException。但在這裏,它沒有,爲什麼?

+2

我認爲這是因爲您的主類在同一個類中。你可以把它放在不同的班級,然後嘗試嗎? – Avi

回答

3

當訪問「可訪問的對象」(方法,構造函數,字段等)時,對反射進行訪問檢查。在這種情況下,您的字段正在從允許訪問它的類寫入,因此它可以工作。 (另外:這與Java 7方法句柄截然不同,在創建方法句柄時會發生訪問檢查,而不是在使用時。您可以使用方法句柄爲您提供對方法的額外訪問有權訪問,通過將其傳遞給通常不具有此類訪問權限的其他代碼)。

相關問題