Java反射機(jī)制中g(shù)etFields和getDeclareFields的區(qū)別

在java反射機(jī)制中,代表java類型的Class<?>對(duì)象有兩個(gè)獲得類字段的方法getFields和getDeclareFields,這兩個(gè)方法的區(qū)別如下

getFields方法

返回一個(gè)Field類型數(shù)組,其中包含當(dāng)前類的public字段,如果此類繼承于某個(gè)父類,同事包括父類的public字段。其它的proteced和private字段,無論是屬于當(dāng)前類還是父類都不被此方法獲取。

getDeclareFields方法

返回一個(gè)Field類型數(shù)組,結(jié)果包含當(dāng)前類的所有字段,private、protected、public或者無修飾符都在內(nèi)。另外,此方法返回的結(jié)果不包括父類的任何字段。 此方法只是針對(duì)當(dāng)前類的。

代碼示例

public class MainSuper {
    public int publicField;
    protected long protecedField;
    private String privateField;
    public static int staticPublicField;
    protected static long staticProtectedField;
    private static String staticPrivateField;
}
public class Main extends MainSuper {

    public int publicField;
    protected long protectedField;
    private String privateField;

    public static int staticPublicField;
    protected static long staticProtectedField;
    private static String staticPrivateField;

    public static void main(String[] args) {
        System.out.println("getFields方法");
        System.out.println("..................................................");
        printFields(Main.class.getFields());
        System.out.println("--------------------------------------------------");
        System.out.println("getDeclaredFields");
        System.out.println("..................................................");
        printFields(Main.class.getDeclaredFields());
    }

    private static void printFields( Field[] fields ) {
        for(Field field : fields) {
            System.out.println(field);
        }
    }
}

執(zhí)行結(jié)果如下

getFields方法
..................................................
public int Main.publicField
public static int Main.staticPublicField
public int MainSuper.publicField
public static int MainSuper.staticPublicField
--------------------------------------------------
getDeclaredFields
..................................................
public int Main.publicField
protected long Main.protectedField
private java.lang.String Main.privateField
public static int Main.staticPublicField
protected static long Main.staticProtectedField
private static java.lang.String Main.staticPrivateField

相似的方法

與獲得字段的方法對(duì)應(yīng),獲得方法、內(nèi)部類、構(gòu)造方法也有對(duì)應(yīng)的方法

getMethods
getDeclaredMethods

getClasses
getDeclaredClasses

getConstructors
getDeclaredConstructors

訪問私有成員

當(dāng)我們通過 getDeclaredXXX 系列方法獲得私有成員時(shí),默認(rèn)是無法訪問的,強(qiáng)行訪問會(huì)報(bào)類似的錯(cuò)誤

java.lang.IllegalAccessException: Class client.Debugger can not access a member of class client.ClientServer with modifiers "private static final"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)

要使私有成員能訪問,進(jìn)行如下調(diào)用即可

field.setAccessible(true);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 熊志軍~【日精進(jìn)打卡第578天】 1月28號(hào)卡 付達(dá)新商貿(mào)~眾德營(yíng)銷 沈陽盛和塾道盛組/稻芽七組 {祈愿} (1)...
    熊志軍閱讀 176評(píng)論 0 0
  • 窗外下著雪 有點(diǎn)滑滑的 一雙雙腳印 很是有激情 聽著別人訴說不幸 才發(fā)現(xiàn) 原來 我不是那一個(gè)例外 原來 我跟其它女...
    傻丫頭小芳閱讀 212評(píng)論 0 0
  • 老來多健忘,唯不忘相思。 ——白居易《偶作寄朗之》
    喜亭_bf8f閱讀 226評(píng)論 7 22
  • ~~~早還沒起,娃娃就就說今天有點(diǎn)難受,(昨晚有點(diǎn)咳嗦,有點(diǎn)吐,)呵呵,我說你想說什么呢?今天不能上學(xué)了!是么?你...
    愛上閱讀做好媽媽閱讀 295評(píng)論 0 0

友情鏈接更多精彩內(nèi)容