欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)建實例對象
        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();
        //實例一個外部類對象
        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)部類是私有的,需要強制獲取構(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

    這篇文章主要介紹了Spring高階用法之自定義業(yè)務(wù)對象組件化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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,因為會把Integer自動拆箱為int再去比,需要的朋友可以參考下
    2023-12-12
  • Hibernate環(huán)境搭建與配置方法(Hello world配置文件版)

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

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

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

    這篇文章主要介紹了Java并發(fā)框架中的AQS詳細(xì)解析,之前說鎖的升級的時候,說到了自旋鎖會空轉(zhuǎn)幾次嘗試等待獲取資源,其實這一系列的動作是有一個規(guī)范的這個規(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項目優(yōu)化的詳細(xì)教程

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

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

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

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

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

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

最新評論