怎樣通過(guò)反射獲取非靜態(tài)內(nèi)部類(lèi)實(shí)例
一、無(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)文章
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-12Java 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-07webuploader在springMVC+jquery+Java開(kāi)發(fā)環(huán)境下的大文件分片上傳的實(shí)例代碼
這篇文章主要介紹了webuploader在springMVC+jquery+Java開(kāi)發(fā)環(huán)境下的大文件分片上傳的實(shí)例代碼,需要的朋友可以參考下2017-04-04springboot+springsecurity+mybatis+JWT+Redis?實(shí)現(xiàn)前后端離實(shí)戰(zhàn)教程
這篇文章主要介紹了springboot+springsecurity+mybatis+JWT+Redis?實(shí)現(xiàn)前后端離實(shí)戰(zhàn)教程,需要的朋友可以參考下2024-01-01IDEA 2020.1打開(kāi)時(shí)閃退的問(wèn)題及解決方法(完美解決方法)
這篇文章主要介紹了IDEA 2020.1打開(kāi)時(shí)閃退問(wèn)題及解決方法,本文給大家分享我的處理方案,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04