您好,登錄后才能下訂單哦!
本篇內容主要講解“如何使用Java中的反射機制調用類中的私有方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何使用Java中的反射機制調用類中的私有方法”吧!
前言
一、私有方法在本類中直接調用
1、在本類中實例化,調用私有方法
2、嘗試在其他類直接調用私有方法(錯誤示范)
二、使用反射機制實例化類強制調用私有方法
1、使用類加載器加載被調用的類
2、使用 Object 類對獲取的類進行實例化
3、調用 Java 反射中的 Method 類
4、取消 Java 語言的訪問檢查
5、使用 method.invoke(Object obj,Object args[]);返回對象
三、完整實現代碼、運行結果及總結
在 Java 中如果我們使用 new 關鍵字調用構造函數對類進行實例化,我們就可以根據在這個類中的修飾符來訪問類中定義的非私有方法。但是如果需要在其他類調用私有的方法,就可以利用 Java 中提供的反射來實現。
說明:被 private
關鍵字修飾的構造方法、方法或者數據域只在其所在的類中可見。
如下:我們創建一個Demo
類,并定義一個私有的方法demo()
,使用main
函數在本類中使用new
關鍵字實例化類,去調用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();}}
如果我們直接在其他的類中實例化Demo
類,來直接調用demo()
方法,就會發現 IDE 直接產生編譯錯誤,很明顯我們直接在另一個類中調用私有方法是行不通的,IDE 提示我們把private
修飾符去掉,這又是不滿足我們需求的。
Class<?> cls = Class.forName("com.bailu.demo.Demo");
說明:這里的Class<?>
即為 Java 中的泛型。以下是我們在開發中常見的幾種泛型:
? 表示不確定的 java 類型
T 表示 java 類型
K V 分別代表java鍵值中的Key Value
E 代表Element
Object obj = cls.newInstance();
說明:Object
是所有類的根類,是具體的一個類,使用的時候可能需要類型強制轉換的,但是用通配符 ?、T 、K 、V、 E
等這些的話,在實際用之前類型就已經確定了,不需要強制轉換。
Method method = cls.getDeclaredMethod("demo", null);
說明:Method
類是java.lang.reflect
中提供的一個類。我們通過實例化Method
類來調用Method
類中的方法。常用方法有以下幾個。這里我們調用第四個獲取 Demo 類的 demo() 方法,參數類型為 null。
getMethods():獲得類的 public 類型的方法
getMethod(String name, Class[] params):獲得類的特定方法,name 參數指定方法的名字,params 參數指定方法的參數類型
getDeclaredMethods():獲取類中所有的方法(public、protected、default、private)
getDeclaredMethod(String name, Class[] params):獲得類的特定方法,name 參數指定方法的名字,params 參數指定方法的參數類型
method.setAccessible(true);
setAccessible(true/false)
:表示禁用和啟用安全檢查的開關。
說明:當值為true
時,指反射對象在使用時應該取消 Java 語言訪問檢查,值為false
則只是反射的對象應該試試 Java 語言訪問檢查。當值設置為true
時,不接受檢查,可以提高反射的運行速度。
使用 method.invoke(Object obj,Object args[]);返回對象,強制執行對象中的目標方法。
method.invoke(obj, null);
說明:Method
類的invoke(Object obj,Object args[])
方法接收的參數必須為對象,如果參數為基本類型數據,必須轉換為相應的包裝類型的對象。invoke()
方法的返回值總是對象,如果實際被調用的方法的返回類型是基本類型數據,那么invoke()
方法會把它轉換為相應的包裝類型的對象,再將其返回。
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、使用類加載器加載被調用的類 Class<?> cls = Class.forName("com.bailu.demo.Demo");// 2、使用Object類對獲取的類進行實例化 Object obj = cls.newInstance();// 將異常拋出try { // 3、調用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();}}}
運行結果如下圖所示:
到此,相信大家對“如何使用Java中的反射機制調用類中的私有方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。