怎樣通過(guò)反射獲取非靜態(tài)內(nèi)部類實(shí)例
一、無(wú)參構(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)部類對(duì)象需要依賴外部類的對(duì)象
【2】通過(guò)Class獲取內(nè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)部類
- 第二種:通過(guò)外部類Class使用OuterClass.class.getDeclaredClasses()獲取外部類下可用的內(nèi)部類對(duì)象
【3】實(shí)例化類需要構(gòu)造器,反射調(diào)用構(gòu)造器需要設(shè)置可訪問(wèn)constructor.setAccessible(true);
@Test
public void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException {
//需要依賴外部類對(duì)象實(shí)例化內(nèi)部類
Class outerClass = Class.forName("reflection.demo.OuterClass");
Object outerObject = outerClass.newInstance();
//如果知道外部類下內(nèi)部類數(shù)量,那么通過(guò)下面方式即可
Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0];
//如果知道內(nè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)造器和父類Class創(chuàng)建內(nè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)部類
* @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 {
//需要依賴外部類對(duì)象實(shí)例化內(nèi)部類
Class outerClass = Class.forName("reflection.demo.OuterClass");
Constructor declaredConstructor = outerClass.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
//獲取外部類實(shí)例以及設(shè)置構(gòu)造函數(shù)值
Object outerObject = declaredConstructor.newInstance("outerClass");
//如果知道外部類下內(nèi)部類數(shù)量,那么通過(guò)下面方式即可
Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0];
//如果知道內(nè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)造器和父類Class創(chuàng)建內(nè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-12
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í)例代碼,需要的朋友可以參考下2017-04-04
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)題及解決方法,本文給大家分享我的處理方案,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

