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

怎樣通過反射獲取非靜態(tài)內(nèi)部類實例

 更新時間:2023年03月09日 14:53:24   作者:ZWZhangYu  
這篇文章主要介紹了怎樣通過反射獲取非靜態(tài)內(nèi)部類實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、無參構(gòu)造函數(shù)

/**
 *  反射內(nèi)部類
 * @author zhangyu
 * @date 2022/1/8
*/
public class OuterClass {

    public void process() {
        System.out.println("外部類方法...");
    }

    class InnerClass {
        public void process() {
            System.out.println("內(nèi)部類方法...");
        }
    }
}

【1】獲取內(nèi)部類對象需要依賴外部類的對象

【2】通過Class獲取內(nèi)部類可以通過倆種方式

  • 第一種:Class.forName("package.name.OuterClass I n n e r C l a s s " ) 通 過 InnerClass") 通過 InnerClass")通過符號定位到內(nèi)部類
  • 第二種:通過外部類Class使用OuterClass.class.getDeclaredClasses()獲取外部類下可用的內(nèi)部類對象

【3】實例化類需要構(gòu)造器,反射調(diào)用構(gòu)造器需要設(shè)置可訪問constructor.setAccessible(true);

    @Test
    public  void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException {
        //需要依賴外部類對象實例化內(nèi)部類
        Class outerClass = Class.forName("reflection.demo.OuterClass");
        Object outerObject = outerClass.newInstance();
        //如果知道外部類下內(nèi)部類數(shù)量,那么通過下面方式即可
        Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0];
        //如果知道內(nèi)部類全限定名,可以通過下面的方式
        //Class<?> innerClass = Class.forName("full.package.name.OuterClass$InnerClass")
        //獲取默認構(gòu)造器
        Constructor<?> constructor = innerClass.getDeclaredConstructors()[0];
        //也可以通過下面的方式獲取構(gòu)造器
        //Constructor<?> constructor = innerClass.getDeclaredConstructor(OuterClass.class);
        //默認構(gòu)造器私有的,需要設(shè)置可訪問
        constructor.setAccessible(true);
        //通過構(gòu)造器和父類Class創(chuàng)建內(nèi)部類實例
        Object innerObject = constructor.newInstance(outerObject);
        Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process");
        innerClassDeclaredMethod.setAccessible(true);
        innerClassDeclaredMethod.invoke(innerObject);
    }

二、有參構(gòu)造函數(shù)

上面描述的是不帶參數(shù)的構(gòu)造函數(shù),下面描述下帶參數(shù)的構(gòu)造函數(shù)

/**
 *  反射內(nèi)部類
 * @author zhangyu
 * @date 2022/1/8
*/
public class OuterClass {

    private  String name;

    public OuterClass(String name) {
        this.name = name;
    }

    public void process() {
        System.out.println("外部類方法...");
    }

    class InnerClass {
        private  String name;

        public InnerClass(String name) {
            this.name = name;
        }

        public void process() {
            System.out.println(name+"----內(nèi)部類方法...");
        }
    }
}
    @Test
    public  void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException {
        //需要依賴外部類對象實例化內(nèi)部類
        Class outerClass = Class.forName("reflection.demo.OuterClass");
        Constructor declaredConstructor = outerClass.getDeclaredConstructor(String.class);
        declaredConstructor.setAccessible(true);
        //獲取外部類實例以及設(shè)置構(gòu)造函數(shù)值
        Object outerObject = declaredConstructor.newInstance("outerClass");

        //如果知道外部類下內(nèi)部類數(shù)量,那么通過下面方式即可
        Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0];
        //如果知道內(nèi)部類全限定名,可以通過下面的方式
        //Class<?> innerClass = Class.forName("full.package.name.OuterClass$InnerClass")
        //獲取默認構(gòu)造器
        Constructor<?> constructor = innerClass.getDeclaredConstructors()[0];
        //也可以通過下面的方式獲取構(gòu)造器
        //Constructor<?> constructor = innerClass.getDeclaredConstructor(OuterClass.class);
        //默認構(gòu)造器私有的,需要設(shè)置可訪問
        constructor.setAccessible(true);
        //通過構(gòu)造器和父類Class創(chuàng)建內(nèi)部類實例.設(shè)置構(gòu)造函數(shù)值
        Object innerObject = constructor.newInstance(outerObject,"innerClass");
        Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process");
        innerClassDeclaredMethod.setAccessible(true);
        innerClassDeclaredMethod.invoke(innerObject);
    }

總結(jié)

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

相關(guān)文章

  • 全面理解Java類和對象

    全面理解Java類和對象

    下面小編就為大家?guī)硪黄胬斫釰ava類和對象。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Eolink上傳文件到Java后臺進行處理的示例代碼

    Eolink上傳文件到Java后臺進行處理的示例代碼

    這篇文章主要介紹了Eolink上傳文件到Java后臺進行處理,這里是上傳的excel表格數(shù)據(jù)并轉(zhuǎn)換為java集合對象、然后進行業(yè)務邏輯處理判斷最后保存到數(shù)據(jù)庫?,需要的朋友可以參考下
    2022-12-12
  • Java由淺入深帶你精通繼承super

    Java由淺入深帶你精通繼承super

    繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為
    2022-03-03
  • Java socket通信模擬QQ實現(xiàn)多人聊天室

    Java socket通信模擬QQ實現(xiàn)多人聊天室

    Socket在Java實戰(zhàn)網(wǎng)絡(luò)通信編程應用中有非常重要的作用,你想要跟別人聯(lián)系都得通過socket占據(jù)端口來實現(xiàn),掌握Socket技術(shù)不僅在聊天應用程序中需要用到(比如QQ什么的都都是用socket來寫的),而且對于學習 Asp.net 也非常有幫助
    2022-07-07
  • webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼

    webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼

    這篇文章主要介紹了webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼,需要的朋友可以參考下
    2017-04-04
  • 深入解析spring?AOP原理及源碼

    深入解析spring?AOP原理及源碼

    這篇文章主要介紹了spring?AOP原理及源碼分析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒,需要的朋友可以參考下
    2022-04-04
  • springboot+springsecurity+mybatis+JWT+Redis?實現(xiàn)前后端離實戰(zhàn)教程

    springboot+springsecurity+mybatis+JWT+Redis?實現(xiàn)前后端離實戰(zhàn)教程

    這篇文章主要介紹了springboot+springsecurity+mybatis+JWT+Redis?實現(xiàn)前后端離實戰(zhàn)教程,需要的朋友可以參考下
    2024-01-01
  • IDEA 2020.1打開時閃退的問題及解決方法(完美解決方法)

    IDEA 2020.1打開時閃退的問題及解決方法(完美解決方法)

    這篇文章主要介紹了IDEA 2020.1打開時閃退問題及解決方法,本文給大家分享我的處理方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • JAVA讀取文本文件內(nèi)容實例代碼

    JAVA讀取文本文件內(nèi)容實例代碼

    這篇文章主要給大家介紹了關(guān)于JAVA讀取文本文件內(nèi)容的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • java基礎(chǔ)學習筆記之反射

    java基礎(chǔ)學習筆記之反射

    什么是反射?Java 程序在運行期間可以動態(tài)加載、解析和使用一些在編譯階段并不確定的類型數(shù)據(jù),這一機制被稱為反射(Reflection)。今天我們就來詳細探討下java中的反射
    2016-02-02

最新評論