簡體   English   中英

Java反射是可訪問的方法

[英]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;

}

結果是錯誤的。 但事實並非如此,因為我可以這樣訪問protectedBufferfirstBase.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM