最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何通過反射獲取私有構(gòu)造、私有對象、私有字段、私有方法

 更新時間:2021年12月14日 11:27:10   作者:弦上的夢  
這篇文章主要介紹了Java如何通過反射獲取私有構(gòu)造、私有對象、私有字段、私有方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java反射獲取私有構(gòu)造、私有對象、私有字段、私有方法

1. 創(chuàng)建測試的私有對象

/**
 * @author lirong
 * @desc 測試對象
 * @date 2019/06/20 20:07
 */
public class Person {
    private int age = 5;
    private String name;
    private Person(){}
    private String test(String name){
        System.out.println("name: "+name);
        return "test";
    }
}

2. 獲取私有對象中的屬性和方法

/**
 * @author lirong
 * @desc 反射獲取私有屬性和方法
 * @date 2019/06/20 20:10
 */
public class Test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        // 1. 獲取class對象
        Class clazz = Person.class;
        // 2. 獲取私有無參構(gòu)造
        Constructor c = clazz.getDeclaredConstructor();
        // 3. 設(shè)置訪問為可見
        c.setAccessible(true);
        // 4. 通過構(gòu)造器創(chuàng)建實(shí)例對象
        Person person = (Person) c.newInstance();
        
        // 根據(jù)字段名稱獲取class中的字段
        Field age = clazz.getDeclaredField("age");
        age.setAccessible(true);
        System.out.println(age.getName() + " = " + age.get(person));
        // 修改私有變量的默認(rèn)值
        age.set(person, 18);
        System.out.println(age.getName() + " = " + age.get(person));
        // 5. 獲取所有字段
        Field[] fields = clazz.getDeclaredFields();
        for (Field f : fields) {
            // 設(shè)置字段的可見性
            f.setAccessible(true);
            String name = f.getName();
            Object o = f.get(person);
            System.out.println(name + " - " + o);
        }
        // 6. 獲取所有的方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method m : methods) {
            m.setAccessible(true);
            String name = m.getName();
            Object invoke = m.invoke(person, "張三");
            System.out.println(name + " = "+invoke);
        }
    }
}

通過反射獲取私有內(nèi)部類對象

首先是我們的目標(biāo)對象:

class Out {
    //目標(biāo)獲取Inner對象
    private class Inner {
        //內(nèi)部類的私有成員屬性
        private String inner = "ccc";
    }
}

直接列出代碼

public class Main {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void main(String[] args) throws Exception {
        //獲取外部類
        Class clzz = Out.class;
        //獲取外部類默認(rèn)無參構(gòu)造方法
        Constructor con = clzz.getDeclaredConstructor();
        //實(shí)例一個外部類對象
        Out outObj = (Out) con.newInstance();
        //獲取外部類內(nèi)的所有內(nèi)部類
        Class innerClazz[] = clzz.getDeclaredClasses();
        //遍歷
        for (Class c : innerClazz) {
            //獲取修飾符的整數(shù)編碼
            int mod = c.getModifiers();
            //返回整數(shù)編碼對應(yīng)的修飾符的字符串對象
            String modifier = Modifier.toString(mod);
            //找到被private修飾的內(nèi)部類
            if (modifier.contains("private")) {
                //根據(jù)內(nèi)部類的特性,需要由外部類來反射獲取內(nèi)部類的構(gòu)造方法(這里獲取的是內(nèi)部類的默認(rèn)構(gòu)造方法)
                Constructor cc = c.getDeclaredConstructor(clzz);
                //由于內(nèi)部類是私有的,需要強(qiáng)制獲取構(gòu)造方法的訪問權(quán)限
                cc.setAccessible(true);
                //由外部類對象來反射獲取內(nèi)部類的對象
                Object obj=cc.newInstance(outObj);
                //獲取內(nèi)部類的私有成員屬性inner
                Field f=c.getDeclaredField("inner");
                //獲取訪問權(quán)限
                f.setAccessible(true);
                //獲取內(nèi)部類對象obj中的私有成員屬性inner的值
                System.out.println(f.get(obj));
            }
        }
    }
}

輸出結(jié)果:

ccc

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟異常

    Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟異常

    這篇文章主要為大家介紹了Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟的異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步
    2022-02-02
  • Spring中校驗(yàn)器(Validator)的深入講解

    Spring中校驗(yàn)器(Validator)的深入講解

    Spring校驗(yàn)器,參數(shù)校驗(yàn)從此簡單。下面這篇文章主要給大家介紹了關(guān)于Spring中校驗(yàn)器(Validator)的相關(guān)資料,文中通過示例代碼介紹非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • java接口返回參數(shù)按照請求參數(shù)進(jìn)行排序方式

    java接口返回參數(shù)按照請求參數(shù)進(jìn)行排序方式

    這篇文章主要介紹了java接口返回參數(shù)按照請求參數(shù)進(jìn)行排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java new一個對象的過程實(shí)例解析

    java new一個對象的過程實(shí)例解析

    這篇文章主要介紹了java new一個對象的過程實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例

    Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例

    這篇文章主要介紹了Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例,讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作,而從數(shù)據(jù)庫處理SELECT查詢操作,數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫,需要的朋友可以參考下
    2023-10-10
  • 基于Bigdecimal科學(xué)計(jì)數(shù)問題

    基于Bigdecimal科學(xué)計(jì)數(shù)問題

    這篇文章主要介紹了基于Bigdecimal科學(xué)計(jì)數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java?String拼接json的方式實(shí)現(xiàn)

    java?String拼接json的方式實(shí)現(xiàn)

    本文主要介紹了java?String拼接json的方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • java兩個數(shù)組合并為一個數(shù)組的幾種方法

    java兩個數(shù)組合并為一個數(shù)組的幾種方法

    這篇文章主要給大家介紹了關(guān)于java兩個數(shù)組合并為一個數(shù)組的幾種方法,最近在寫代碼時遇到了需要合并兩個數(shù)組的需求,文中將每種方法都介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Struts1教程之ActionMapping_動力節(jié)點(diǎn)Java學(xué)院整理

    Struts1教程之ActionMapping_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Struts1教程之ActionMapping,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java通俗易懂系列設(shè)計(jì)模式之適配器模式

    Java通俗易懂系列設(shè)計(jì)模式之適配器模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之適配器模式,對設(shè)計(jì)模式感興趣的同學(xué),一定要看一下
    2021-04-04

最新評論

崇仁县| 仁布县| 彰化市| 永州市| 电白县| 昌都县| 丰台区| 宜阳县| 南通市| 松潘县| 沁源县| 兴山县| 噶尔县| 长子县| 邵东县| 昌平区| 浮山县| 阿拉善右旗| 健康| 鹤壁市| 西和县| 满城县| 淳安县| 达日县| 庆阳市| 卢龙县| 乌拉特中旗| 东阳市| 项城市| 万荣县| 镇沅| 兴和县| 深水埗区| 阿巴嘎旗| 齐齐哈尔市| 岑溪市| 禹城市| 定结县| 黄浦区| 万盛区| 绥中县|