亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

/**
 * @author lirong
 * @desc 測試對(duì)象
 * @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. 獲取私有對(duì)象中的屬性和方法

/**
 * @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對(duì)象
        Class clazz = Person.class;
        // 2. 獲取私有無參構(gòu)造
        Constructor c = clazz.getDeclaredConstructor();
        // 3. 設(shè)置訪問為可見
        c.setAccessible(true);
        // 4. 通過構(gòu)造器創(chuàng)建實(shí)例對(duì)象
        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)部類對(duì)象

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

class Out {
    //目標(biāo)獲取Inner對(duì)象
    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í)例一個(gè)外部類對(duì)象
        Out outObj = (Out) con.newInstance();
        //獲取外部類內(nèi)的所有內(nèi)部類
        Class innerClazz[] = clzz.getDeclaredClasses();
        //遍歷
        for (Class c : innerClazz) {
            //獲取修飾符的整數(shù)編碼
            int mod = c.getModifiers();
            //返回整數(shù)編碼對(duì)應(yīng)的修飾符的字符串對(duì)象
            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);
                //由外部類對(duì)象來反射獲取內(nèi)部類的對(duì)象
                Object obj=cc.newInstance(outObj);
                //獲取內(nèi)部類的私有成員屬性inner
                Field f=c.getDeclaredField("inner");
                //獲取訪問權(quán)限
                f.setAccessible(true);
                //獲取內(nèi)部類對(duì)象obj中的私有成員屬性inner的值
                System.out.println(f.get(obj));
            }
        }
    }
}

輸出結(jié)果:

ccc

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

相關(guān)文章

  • 詳解Java中的Lambda表達(dá)式

    詳解Java中的Lambda表達(dá)式

    這篇文章主要介紹了Java中的Lambda表達(dá)式的的相關(guān)資料,文中講解非常詳細(xì),示例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Spring高階用法之自定義業(yè)務(wù)對(duì)象組件化

    Spring高階用法之自定義業(yè)務(wù)對(duì)象組件化

    這篇文章主要介紹了Spring高階用法之自定義業(yè)務(wù)對(duì)象組件化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析

    Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析

    這篇文章主要介紹了Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析,Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null,int和integer(無論new否)比,都為true,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比,需要的朋友可以參考下
    2023-12-12
  • Hibernate環(huán)境搭建與配置方法(Hello world配置文件版)

    Hibernate環(huán)境搭建與配置方法(Hello world配置文件版)

    這篇文章主要介紹了Hibernate環(huán)境搭建與配置方法,這里演示Hello world配置文件版的具體實(shí)現(xiàn)步驟與相關(guān)代碼,需要的朋友可以參考下
    2016-03-03
  • Java并發(fā)框架中的AQS詳細(xì)解析

    Java并發(fā)框架中的AQS詳細(xì)解析

    這篇文章主要介紹了Java并發(fā)框架中的AQS詳細(xì)解析,之前說鎖的升級(jí)的時(shí)候,說到了自旋鎖會(huì)空轉(zhuǎn)幾次嘗試等待獲取資源,其實(shí)這一系列的動(dòng)作是有一個(gè)規(guī)范的這個(gè)規(guī)范叫做同步發(fā)生器AbstractQueuedSynchronizer ,簡稱AQS,需要的朋友可以參考下
    2024-01-01
  • Java中Static關(guān)鍵字的五種用法詳解

    Java中Static關(guān)鍵字的五種用法詳解

    這篇文章主要介紹了Java中static的五種用法:修飾成員變量,修飾成員方法,修飾內(nèi)部類,靜態(tài)代碼塊,靜態(tài)導(dǎo)包,想詳細(xì)了解的小伙伴可以參考閱讀本文
    2023-03-03
  • java?線程池如何執(zhí)行策略又拒絕哪些策略

    java?線程池如何執(zhí)行策略又拒絕哪些策略

    這篇文章主要介紹了java?線程池如何執(zhí)行策略又拒絕哪些策略,文章通過線程池的執(zhí)行方法?execute()?展開全篇內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • Jvm調(diào)優(yōu)和SpringBoot項(xiàng)目優(yōu)化的詳細(xì)教程

    Jvm調(diào)優(yōu)和SpringBoot項(xiàng)目優(yōu)化的詳細(xì)教程

    這篇文章主要介紹了Jvm調(diào)優(yōu)和SpringBoot項(xiàng)目優(yōu)化,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java NIO寫大文件對(duì)比(win7和mac)

    Java NIO寫大文件對(duì)比(win7和mac)

    這篇文章主要介紹了Java NIO寫大文件對(duì)比(win7和mac),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • SpringBoot如何讀取war包jar包和Resource資源

    SpringBoot如何讀取war包jar包和Resource資源

    這篇文章主要介紹了SpringBoot如何讀取war包jar包和Resource資源,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論