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

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

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

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

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

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

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

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

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

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

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

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

    class InnerClass {
        private  String name;

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

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

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

總結(jié)

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

相關(guān)文章

  • 全面理解Java類(lèi)和對(duì)象

    全面理解Java類(lèi)和對(duì)象

    下面小編就為大家?guī)?lái)一篇全面理解Java類(lèi)和對(duì)象。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Eolink上傳文件到Java后臺(tái)進(jìn)行處理的示例代碼

    Eolink上傳文件到Java后臺(tái)進(jìn)行處理的示例代碼

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

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

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

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

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

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

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

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

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

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

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

    IDEA 2020.1打開(kāi)時(shí)閃退的問(wèn)題及解決方法(完美解決方法)

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

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

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

    java基礎(chǔ)學(xué)習(xí)筆記之反射

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

最新評(píng)論