国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用反射調(diào)用類的私有內(nèi)部類的私有方法

這篇具有很好參考價值的文章主要介紹了使用反射調(diào)用類的私有內(nèi)部類的私有方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


在進行單元測試時,我們往往需要直接訪問某個類的內(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

到了這里,關于使用反射調(diào)用類的私有內(nèi)部類的私有方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Java進階(7)——手動實現(xiàn)LinkedList & 內(nèi)部node類的實現(xiàn) & 增刪改查的實現(xiàn) & toString方法 & 源碼的初步理解

    Java進階(7)——手動實現(xiàn)LinkedList & 內(nèi)部node類的實現(xiàn) & 增刪改查的實現(xiàn) & toString方法 & 源碼的初步理解

    1.linkedList的節(jié)點,當前,上一個,下一個的思想; 2.根據(jù)index找node的方法,根據(jù)index確定從頭部還是尾部; 3.linkedlist的增刪改查的實現(xiàn),本質(zhì)是改變節(jié)點的信息; 4.遞歸方法實現(xiàn)自定義鏈表的toString方法; Java進階(3)——手動實現(xiàn)ArrayList 源碼的初步理解分析 數(shù)組插入數(shù)據(jù)和

    2024年02月11日
    瀏覽(27)
  • java內(nèi)部類的創(chuàng)建

    創(chuàng)建內(nèi)部類非常簡單,就是在類中定義另外一個類。 內(nèi)部類,實際上就是類的嵌套。 2.1 創(chuàng)建 內(nèi)部類如何訪問外部類成員? 可以通過 外部類名稱.this 的形式來獲得外部類對象的引用; 上例中的 System.out.println(Outer.this.index)等價于System.out.println(index) ; 一般情況下,無需這么麻

    2023年04月19日
    瀏覽(17)
  • 49天精通Java,第29天,Java內(nèi)部類、java內(nèi)部類的作用
  • 靜態(tài)內(nèi)部類的訪問方法(static/無static)

    筆記匯總: 《Java面向對象程序設計》學習筆記 用static修飾內(nèi)部類,可以直接通過內(nèi)部類類名訪問靜態(tài)內(nèi)部類。 沒有用static修飾內(nèi)部類,則需要new一個外部類實例,再通過外部實例創(chuàng)建內(nèi)部類。 外部類之外創(chuàng)建內(nèi)部類對象_new通過外部類創(chuàng)建內(nèi)部類對象_Dingwensheng1222的

    2024年02月14日
    瀏覽(15)
  • 【Python】面向對象 - 封裝 ② ( 訪問私有成員 | 對象無法訪問私有變量 / 方法 | 類內(nèi)部訪問私有成員 )

    【Python】面向對象 - 封裝 ② ( 訪問私有成員 | 對象無法訪問私有變量 / 方法 | 類內(nèi)部訪問私有成員 )

    在下面的 Python 類 Student 中 , 定義了私有的成員變量 , 該私有成員變量 , 只能在類內(nèi)部進行訪問 , 類的外部無法進行訪問 ; 在 類外部 創(chuàng)建的 Student 實例對象 , 是無法訪問 __address 私有成員的 ; 使用 實例對象 訪問 類的私有成員 , 編譯時不會報錯 , 但是運行時會報錯 最后一行代

    2024年02月13日
    瀏覽(24)
  • Java語言------四種內(nèi)部類的詳細講解

    Java語言------四種內(nèi)部類的詳細講解

    目錄 一.內(nèi)部類的介紹 二.內(nèi)部類的種類 2.1實例內(nèi)部類? ? ?? 2.2.靜態(tài)內(nèi)部類 2.3局部內(nèi)部類 2.4匿名內(nèi)部類 總結? ? ? ? 內(nèi)部類: 一個類定義在? 另一個類? 的? 內(nèi)部。?? ? ? ?內(nèi)部類分為 四種 : 實例內(nèi)部類、靜態(tài)內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類。 使用時機:當一個事

    2023年04月25日
    瀏覽(23)
  • java反射的基本使用方法

    當我們使用 Java 開發(fā)時,有時需要獲取某個類的信息,例如類的屬性、方法和構造函數(shù)等,然后在程序運行期間動態(tài)地操作它們。Java 反射就是用來實現(xiàn)這個目的的一種機制。 Java 反射(Reflection)是 Java 編程語言在運行時動態(tài)獲取類的信息以及動態(tài)調(diào)用對象方法的能力。它可

    2024年02月16日
    瀏覽(25)
  • Java進程ProcessBuilder類的介紹及使用,ProcessBuilder調(diào)用外部程序執(zhí)行shell命令Linux命令

    Java進程ProcessBuilder類的介紹及使用,ProcessBuilder調(diào)用外部程序執(zhí)行shell命令Linux命令

    目錄 ProcessBuilder類的介紹及使用 【前言】 【正文】 --構造方法-- --常用方法-- --使用技巧-- --調(diào)用本地Shell命令,實例-- 【總結】 【注意】 ????????在做一個項目的時候需要用到運行時動態(tài)執(zhí)行JAVA命令,一開始的思路是運行時生成bat腳本,然后通過Runtime類的exec方法之行

    2024年02月09日
    瀏覽(27)
  • C# 通過反射以及動態(tài)調(diào)用方法

    C# 通過反射以及動態(tài)調(diào)用方法

    有時候需要通過反射以及動態(tài)調(diào)用的辦法去調(diào)用已知的實例的方法,感覺還是挺巧妙的。以下主要記錄通過反射以及動態(tài)的調(diào)用方法。 運行結果如下圖所示: 總結:在已知方法的情況下,還是動態(tài)調(diào)用比較方便,但是要注意異常處理,畢竟這屬于特殊情況,編譯執(zhí)行前不會

    2024年02月07日
    瀏覽(26)
  • Java 8 中使用反射進行命令執(zhí)行的 5 個方法

    Java 8 中使用反射進行命令執(zhí)行的 5 個方法

    今天在逛先知的時候看到了一篇文章:《探究使用反射進行除Runtime的命令執(zhí)行方法》https://xz.aliyun.com/t/12446 其中大概講了下命令執(zhí)行的其他構造方式,但最后沒有給出實例,所以我這里就簡單研究了一下。 在RASP等安全產(chǎn)品防護嚴密的現(xiàn)在,普通的尋找Runtime.getRuntime().exec(c

    2023年04月20日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包