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