[英]Java reflection isAccessible method
我正在學習反思。 當我執行以下代碼時:
package main;
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
Base firstBase = new Base();
Field firstBaseField = firstBase.getClass().getDeclaredField("protectedBuffer");
System.out.println(firstBaseField.isAccessible());
}
}
這是基類:
package main;
public class Base {
private StringBuffer buffer;
protected StringBuffer protectedBuffer;
public StringBuffer buffer2;
}
結果是錯誤的。 但事實並非如此,因為我可以這樣訪問protectedBuffer
: firstBase.protectedBuffer
?
這是因為當你執行firstBaseField.isAccessible();
時,你沒有測試是否可以訪問Field protectedBuffer
firstBaseField.isAccessible();
這里發生的是你檢查AccessibleObject
值,它是Field的基類。 此標志不會告訴您java訪問修飾符是否可以訪問該字段,它會告訴您當前是否忽略這些修飾符。
當你在firstBaseField.isAccessible()
上firstBaseField.isAccessible()
它只是意味着java訪問規則仍然存在並且不被反射機制覆蓋。
setAccessible()
將此對象的可訪問標志設置為指示的布爾值。 值true表示反射對象在使用時應禁止Java語言訪問檢查。 值false表示反射對象應強制執行Java語言訪問檢查。
編輯
要測試java訪問修飾符是否可以訪問該字段,您可以嘗試訪問它並捕獲IllegalAccessException
,如下例所示。
Field field = instance.getClass().getDeclaredField("someField");
// IllegalAccessException
field.get(instance);
你錯誤地理解了這個可訪問的標志。 根據可訪問的文檔 ,所有訪問檢查都被繞過(您可以使用此字段或方法,Java不會檢查它是否公開)。 當accessible為false時,訪問檢查工作。 正如它在文檔中所寫,默認情況下對於任何 AccessibleObject
false
的(即使對於public
字段或方法)。
默認情況下,使用Class#getDeclaredField(String name)
檢索的所有Fields
都將accessible
標志設置為false 。 對於public
字段buffer2
您也會得到錯誤。
Field
類是AccessibleObject
的子類:
默認情況下, 無法訪問反射對象。
從Java 9開始,不推薦使用isAccessible
方法。 您可以改用canAccess
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.