怎樣通過反射獲取非靜態(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)造器需要設置可訪問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)造器私有的,需要設置可訪問
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);
//獲取外部類實例以及設置構(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)造器私有的,需要設置可訪問
constructor.setAccessible(true);
//通過構(gòu)造器和父類Class創(chuàng)建內(nèi)部類實例.設置構(gòu)造函數(shù)值
Object innerObject = constructor.newInstance(outerObject,"innerClass");
Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process");
innerClassDeclaredMethod.setAccessible(true);
innerClassDeclaredMethod.invoke(innerObject);
}

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java socket通信模擬QQ實現(xiàn)多人聊天室
Socket在Java實戰(zhàn)網(wǎng)絡通信編程應用中有非常重要的作用,你想要跟別人聯(lián)系都得通過socket占據(jù)端口來實現(xiàn),掌握Socket技術不僅在聊天應用程序中需要用到(比如QQ什么的都都是用socket來寫的),而且對于學習 Asp.net 也非常有幫助2022-07-07
webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼
這篇文章主要介紹了webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼,需要的朋友可以參考下2017-04-04
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打開時閃退問題及解決方法,本文給大家分享我的處理方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

