如何使用Java中的反射機(jī)制調(diào)用類中的私有方法

本篇內(nèi)容主要講解“如何使用Java中的反射機(jī)制調(diào)用類中的私有方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何使用Java中的反射機(jī)制調(diào)用類中的私有方法”吧!

創(chuàng)新互聯(lián)是專業(yè)的宜良網(wǎng)站建設(shè)公司,宜良接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行宜良網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

文章目錄

  • 前言

  • 一、私有方法在本類中直接調(diào)用

    • 1、在本類中實例化,調(diào)用私有方法

    • 2、嘗試在其他類直接調(diào)用私有方法(錯誤示范)

  • 二、使用反射機(jī)制實例化類強(qiáng)制調(diào)用私有方法

    • 1、使用類加載器加載被調(diào)用的類

    • 2、使用 Object 類對獲取的類進(jìn)行實例化

    • 3、調(diào)用 Java 反射中的 Method 類

    • 4、取消 Java 語言的訪問檢查

    • 5、使用 method.invoke(Object obj,Object args[]);返回對象

  • 三、完整實現(xiàn)代碼、運行結(jié)果及總結(jié)


前言

在 Java 中如果我們使用 new 關(guān)鍵字調(diào)用構(gòu)造函數(shù)對類進(jìn)行實例化,我們就可以根據(jù)在這個類中的修飾符來訪問類中定義的非私有方法。但是如果需要在其他類調(diào)用私有的方法,就可以利用 Java 中提供的反射來實現(xiàn)。


一、私有方法在本類中直接調(diào)用

1、在本類中實例化,調(diào)用私有方法

說明:被 private 關(guān)鍵字修飾的構(gòu)造方法、方法或者數(shù)據(jù)域只在其所在的類中可見。

如下:我們創(chuàng)建一個Demo類,并定義一個私有的方法demo(),使用main函數(shù)在本類中使用new關(guān)鍵字實例化類,去調(diào)用demo()方法,運行成功輸出結(jié)果。

package com.bailu.demo;public class Demo {   private void demo() {   
		System.out.println("私有方法!");}// 私有方法只有在本類中可以訪問public static void main(String[] args) {   
		Demo demo = new Demo();
		demo.demo();}}

如何使用Java中的反射機(jī)制調(diào)用類中的私有方法

2、嘗試在其他類直接調(diào)用私有方法(錯誤示范)

如果我們直接在其他的類中實例化Demo類,來直接調(diào)用demo()方法,就會發(fā)現(xiàn) IDE 直接產(chǎn)生編譯錯誤,很明顯我們直接在另一個類中調(diào)用私有方法是行不通的,IDE 提示我們把private修飾符去掉,這又是不滿足我們需求的。

二、使用反射機(jī)制實例化類強(qiáng)制調(diào)用私有方法

1、使用類加載器加載被調(diào)用的類

Class<?> cls = Class.forName("com.bailu.demo.Demo");

說明:這里的Class<?> 即為 Java 中的泛型。以下是我們在開發(fā)中常見的幾種泛型:

  • ? 表示不確定的 java 類型

  • T 表示 java 類型

  • K V 分別代表java鍵值中的Key Value

  • E 代表Element

2、使用 Object 類對獲取的類進(jìn)行實例化

Object obj = cls.newInstance();

說明:Object是所有類的根類,是具體的一個類,使用的時候可能需要類型強(qiáng)制轉(zhuǎn)換的,但是用通配符 ?、T 、K 、V、 E 等這些的話,在實際用之前類型就已經(jīng)確定了,不需要強(qiáng)制轉(zhuǎn)換。

3、調(diào)用 Java 反射中的 Method 類

Method method = cls.getDeclaredMethod("demo", null);

說明:Method類是java.lang.reflect中提供的一個類。我們通過實例化Method類來調(diào)用Method類中的方法。常用方法有以下幾個。這里我們調(diào)用第四個獲取 Demo 類的 demo() 方法,參數(shù)類型為 null。

  • getMethods():獲得類的 public 類型的方法

  • getMethod(String name, Class[] params):獲得類的特定方法,name 參數(shù)指定方法的名字,params 參數(shù)指定方法的參數(shù)類型

  • getDeclaredMethods():獲取類中所有的方法(public、protected、default、private)

  • getDeclaredMethod(String name, Class[] params):獲得類的特定方法,name 參數(shù)指定方法的名字,params 參數(shù)指定方法的參數(shù)類型

4、取消 Java 語言的訪問檢查

method.setAccessible(true);

setAccessible(true/false):表示禁用和啟用安全檢查的開關(guān)。

說明:當(dāng)值為true時,指反射對象在使用時應(yīng)該取消 Java 語言訪問檢查,值為false則只是反射的對象應(yīng)該試試 Java 語言訪問檢查。當(dāng)值設(shè)置為true時,不接受檢查,可以提高反射的運行速度。

5、使用 method.invoke(Object obj,Object args[]);返回對象

使用 method.invoke(Object obj,Object args[]);返回對象,強(qiáng)制執(zhí)行對象中的目標(biāo)方法。

method.invoke(obj, null);

說明:Method類的invoke(Object obj,Object args[])方法接收的參數(shù)必須為對象,如果參數(shù)為基本類型數(shù)據(jù),必須轉(zhuǎn)換為相應(yīng)的包裝類型的對象。invoke()方法的返回值總是對象,如果實際被調(diào)用的方法的返回類型是基本類型數(shù)據(jù),那么invoke()方法會把它轉(zhuǎn)換為相應(yīng)的包裝類型的對象,再將其返回。

三、完整實現(xiàn)代碼、運行結(jié)果及總結(jié)

Demo 類:

package com.bailu.demo;public class Demo {   private void demo() {   
		System.out.println("私有方法!");}// 私有方法只有在本類中可以訪問public static void main(String[] args) {   
		Demo demo = new Demo();
		demo.demo();}}

TestDemo 類:

package com.bailu.demo;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class TestDemo {   public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException {   // 1、使用類加載器加載被調(diào)用的類
		Class<?> cls = Class.forName("com.bailu.demo.Demo");// 2、使用Object類對獲取的類進(jìn)行實例化
		Object obj = cls.newInstance();// 將異常拋出try {   // 3、調(diào)用Java反射中的Method類,將私有方法封裝在obj中
			Method method = cls.getDeclaredMethod("demo", null);// 取消 Java 語言的訪問檢查
			method.setAccessible(true);// 4、使用method.invoke(Object obj,Object args[]);返回對象
			method.invoke(obj, null);} catch (NoSuchMethodException e) {   
			e.printStackTrace();} catch (SecurityException e) {   
			e.printStackTrace();}}}

運行結(jié)果如下圖所示:

如何使用Java中的反射機(jī)制調(diào)用類中的私有方法


到此,相信大家對“如何使用Java中的反射機(jī)制調(diào)用類中的私有方法”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁標(biāo)題:如何使用Java中的反射機(jī)制調(diào)用類中的私有方法
本文網(wǎng)址:http://muchs.cn/article32/ishcpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站營銷、搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作營銷型網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)