日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

發布時間:2025/3/8 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、私有方法在本類中直接調用
    • 1.1、在本類中實例化,調用私有方法
    • 1.2、嘗試在其他類直接調用私有方法(錯誤示范)
  • 二、使用反射實例化類強制調用私有方法
    • 2.1、使用類加載器加載被調用的類
    • 2.2、使用 Object 類對獲取的類進行實例化
    • 2.3、調用 Java 反射中的 Method 類
    • 2.4、取消 Java 語言的訪問檢查
    • 2.5、使用 method 方法返回對象
  • 三、完整實現代碼、運行結果
  • 總結


前言

在 Java 中如果我們使用 new 關鍵字調用構造函數對類進行實例化,我們就可以根據在這個類中的修飾符來訪問類中定義的非私有方法。但是如果需要在其他類調用私有的方法,就可以利用 Java 中提供的反射來實現。


一、私有方法在本類中直接調用

1.1、在本類中實例化,調用私有方法

說明:被 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();} }

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

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

二、使用反射實例化類強制調用私有方法

2.1、使用類加載器加載被調用的類

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

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

  • ? 表示不確定的 Java 類型
  • T 表示 Java 類型
  • K V 分別代表 Java 鍵值中的 Key Value
  • E 代表 Element

2.2、使用 Object 類對獲取的類進行實例化

Object obj = cls.newInstance();

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

2.3、調用 Java 反射中的 Method 類

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

說明:Method類是java.lang.reflect中提供的一個類。我們通過實例化Method類來調用Method類中的方法,常用方法有以下幾個:

  • getMethods():獲得類的 public 類型的方法
  • getMethod(String name, Class[] params):獲得類的特定方法,name 參數指定方法的名字,params 參數指定方法的參數類型
  • getDeclaredMethods():獲取類中所有的方法(public、protected、default、private)
  • getDeclaredMethod(String name, Class[] params):獲得類的特定方法,name 參數指定方法的名字,params 參數指定方法的參數類型

這里我們調用第四個獲取 Demo 類的 demo() 方法,參數類型為 null。

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

method.setAccessible(true);

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

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

2.5、使用 method 方法返回對象

使用 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();}} }

運行結果如下圖所示:


總結

在我們的開發過程中,通常只有實體類(Entity)中的成員變量使用 private 修飾,并且會提供訪問這些變量的 get 和 set 方法。原則上要求不準定義私有的方法,我們使用 method.invoke(Object obj,Object args[]); 強制調用對象調用私有方法違反了我們 Java 中面向對象的特性。


我是白鹿,一個不懈奮斗的程序猿。望本文能對你有所裨益,歡迎大家的一鍵三連!若有其他問題、建議或者補充可以留言在文章下方,感謝大家的支持!

總結

以上是生活随笔為你收集整理的Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。