在進行單元測試時,我們往往需要直接訪問某個類的內(nèi)部類或者某個類的私有方法,此時正常的調(diào)用就無能為力了,因此我們可以使用反射進行調(diào)用。
使用反射調(diào)用類的私有方法
類
package net.mooctest;
public class outClass{
public outClass() {
}
private void testMethod1(){
System.out.println("調(diào)用了outClass的私有方法testMethod1");
}
//帶參數(shù)的方法
private void testMethod2(int a){
System.out.println("調(diào)用了outClass的私有方法testMethod2,傳入?yún)?shù)為:" + a);
}
}
實現(xiàn)方法
- 獲取類的Class對象
-
Class class = Class.forName("類名")
或 Class class = 類實例.getClass()
-
- new一個實例
Object object = class.newInstance();
- 獲取私有方法
Method method = class.getDeclaredMethod("方法名",參數(shù)類型1.class,參數(shù)類型2.class,...);
- 設置方法可訪問
method.setAccessible(true);
- 調(diào)用私有方法
method.invoke(類實例,參數(shù)1,參數(shù)2,...);
實現(xiàn)代碼
import static org.junit.jupiter.api.Assertions.*;
import java.lang.reflect.Method;
import org.junit.jupiter.api.Test;
import net.mooctest.outClass;
class outClassTest {
@Test
final void test1() throws Exception {
outClass out = new outClass();
Class class1 = out.getClass();
Object object = class1.newInstance();
//獲取私有方法
Method method = class1.getDeclaredMethod("testMethod1");
//設置方法可訪問
method.setAccessible(true);
//調(diào)用方法
method.invoke(object);
}
@Test
final void test2() throws Exception {
outClass out = new outClass();
Class class1 = out.getClass();
Object object = class1.newInstance();
//獲取有參私有方法
Method method = class1.getDeclaredMethod("testMethod2",int.class);
//設置方法可訪問
method.setAccessible(true);
//調(diào)用方法
method.invoke(object,10);
}
}
使用反射調(diào)用類的私有內(nèi)部類的私有方法
類
package net.mooctest;
public class outClass{
public outClass() {
}
private void testMethod1(){
System.out.println("調(diào)用了outClass的私有方法testMethod1()");
}
//帶參數(shù)的方法
private void testMethod2(int a){
System.out.println("調(diào)用了outClass的私有方法testMethod2(),傳入?yún)?shù)為:" + a);
}
private class inClass{
public inClass() {
// TODO Auto-generated constructor stub
}
public inClass(int a) {
System.out.println("調(diào)用了有參構造器 " + a);
}
private void inMethod1() {
System.out.println("調(diào)用了類的私有內(nèi)部類的私有方法inMethod1()");
}
}
}
實現(xiàn)方法
- 獲取私有內(nèi)部類的Class對象
Class class = Class.forName("外部類名$內(nèi)部類名")
- 獲取私有內(nèi)部類構造器,無參構造器參數(shù)只填外部類名,有參構造器為(外部類名 ,參數(shù)類名…)
Constructor constructor = class.getDeclaredConstructor(outClass.class,參數(shù)類型1.class,參數(shù)類型2.class,...);
- 設置構造器可訪問
constructor.setAccessible(true);
- new一個外部類對象,以便產(chǎn)生內(nèi)部類實例(outClass:外部類名)
outClass out = new outClass();
- 新建一個內(nèi)部類實例,參數(shù)為外部類實例,若為有參構造器,后面再添加參數(shù)
Object object = constructor.newInstance(外部類實例,構造器參數(shù)1.class,構造器參數(shù)2.class,...);
- 獲取私有方法
Method method = class.getDeclaredMethod("inMethod1");
- 設置方法可訪問
method.setAccessible(true);
- 調(diào)用方法
- method.invoke(object);
實現(xiàn)代碼
package test;
import static org.junit.jupiter.api.Assertions.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.junit.jupiter.api.Test;
import net.mooctest.outClass;
class outClassTest {
@Test
final void test3() throws Exception {
//設置類名,外部類名$內(nèi)部類名
String className = "net.mooctest.outClass$inClass";
Class class1 = Class.forName(className);
//獲取私有內(nèi)部類構造器,無參構造器參數(shù)只填外部類名,有參構造器為(外部類名 ,參數(shù)類名...)
Constructor constructor = class1.getDeclaredConstructor(outClass.class);
//設置構造器可訪問
constructor.setAccessible(true);
//new一個外部類對象,以便產(chǎn)生內(nèi)部類實例
outClass out = new outClass();
//新建一個內(nèi)部類實例,參數(shù)為外部類實例,若為有參構造器,后面再添加參數(shù)
Object object = constructor.newInstance(out);
//獲取私有方法
Method method = class1.getDeclaredMethod("inMethod1");
//設置方法可訪問
method.setAccessible(true);
//調(diào)用方法
method.invoke(object);
}
@Test
final void test4() throws Exception {
//設置類名,外部類名$內(nèi)部類名
String className = "net.mooctest.outClass$inClass";
Class class1 = Class.forName(className);
//獲取私有內(nèi)部類構造器,無參構造器參數(shù)只填外部類名,有參構造器為(外部類名 ,參數(shù)類名...)
Constructor constructor = class1.getDeclaredConstructor(outClass.class,int.class);
//設置構造器可訪問
constructor.setAccessible(true);
//new一個外部類對象,以便產(chǎn)生內(nèi)部類實例
outClass out = new outClass();
//新建一個內(nèi)部類實例,參數(shù)為外部類實例,若為有參構造器,后面再添加參數(shù)
Object object = constructor.newInstance(out,10);
//獲取私有方法
Method method = class1.getDeclaredMethod("inMethod1");
//設置方法可訪問
method.setAccessible(true);
//調(diào)用方法
method.invoke(object);
}
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-728924.html
文章來源:http://www.zghlxwxcb.cn/news/detail-728924.html
到了這里,關于使用反射調(diào)用類的私有內(nèi)部類的私有方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!