最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 中的 getDeclaredMethods() 方法(使用與原理)

 更新時(shí)間:2024年12月27日 10:40:29   作者:AllenBright  
文章介紹了Java反射機(jī)制中的`getDeclaredMethods()`方法,詳細(xì)講解了其使用方法、原理、注意事項(xiàng)以及實(shí)際應(yīng)用場(chǎng)景,幫助讀者更好地理解和應(yīng)用這一強(qiáng)大的工具,感興趣的朋友一起看看吧

在 Java 的反射機(jī)制中,getDeclaredMethods() 是一個(gè)非常重要的方法,它允許我們獲取類中聲明的所有方法(包括公共、私有、保護(hù)以及默認(rèn)訪問(wèn)權(quán)限的方法)。通過(guò)這個(gè)方法,我們可以動(dòng)態(tài)地分析和操作類的行為,這在框架開發(fā)、測(cè)試工具以及動(dòng)態(tài)代理等場(chǎng)景中非常有用。本文將深入探討 getDeclaredMethods() 的使用方法、原理以及注意事項(xiàng),幫助你更好地理解和應(yīng)用它。

1. 什么是 getDeclaredMethods()?

getDeclaredMethods()java.lang.Class 類中的一個(gè)方法,用于返回當(dāng)前類中聲明的所有方法(不包括繼承的方法)。這些方法包括:

  • 公共方法(public
  • 私有方法(private
  • 保護(hù)方法(protected
  • 默認(rèn)訪問(wèn)權(quán)限的方法(包私有)

需要注意的是,getDeclaredMethods() 不會(huì)返回從父類或接口繼承的方法。

2. getDeclaredMethods() 的使用方法

以下是一個(gè)簡(jiǎn)單的示例,展示如何使用 getDeclaredMethods() 獲取類中聲明的所有方法:

import java.lang.reflect.Method;
public class MyClass {
    public void publicMethod() {}
    private void privateMethod() {}
    protected void protectedMethod() {}
    void defaultMethod() {}
    public static void main(String[] args) {
        Class<?> clazz = MyClass.class;
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("Method Name: " + method.getName());
            System.out.println("Modifier: " + method.getModifiers());
            System.out.println("Return Type: " + method.getReturnType());
            System.out.println("Parameters: " + method.getParameterCount());
            System.out.println("-----");
        }
    }
}

輸出結(jié)果:

Method Name: publicMethod
Modifier: 1
Return Type: void
Parameters: 0
-----
Method Name: privateMethod
Modifier: 2
Return Type: void
Parameters: 0
-----
Method Name: protectedMethod
Modifier: 4
Return Type: void
Parameters: 0
-----
Method Name: defaultMethod
Modifier: 0
Return Type: void
Parameters: 0
-----

從輸出中可以看到,getDeclaredMethods() 成功獲取了類中聲明的所有方法,包括私有方法和保護(hù)方法。

3. getDeclaredMethods() 的原理分析

getDeclaredMethods() 的實(shí)現(xiàn)依賴于 Java 的反射機(jī)制。其核心原理如下:

類加載與元數(shù)據(jù)
Java 虛擬機(jī)(JVM)在加載類時(shí),會(huì)為每個(gè)類生成一個(gè) Class 對(duì)象,該對(duì)象包含了類的元數(shù)據(jù)(如方法、字段、構(gòu)造器等)。getDeclaredMethods() 通過(guò)訪問(wèn)這些元數(shù)據(jù)來(lái)獲取類中聲明的方法。

方法信息的存儲(chǔ)
方法信息(如方法名、參數(shù)類型、返回類型、訪問(wèn)修飾符等)存儲(chǔ)在 Method 對(duì)象中。getDeclaredMethods() 返回的是一個(gè) Method 數(shù)組,每個(gè) Method 對(duì)象對(duì)應(yīng)一個(gè)方法。

訪問(wèn)權(quán)限的檢查
默認(rèn)情況下,getDeclaredMethods() 可以獲取所有聲明的方法,包括私有方法。但如果啟用了安全管理器(SecurityManager),則可能會(huì)拋出 SecurityException

4. 與 getMethods() 的區(qū)別

getMethods()getDeclaredMethods() 是 Java 反射中兩個(gè)常用的方法,它們的區(qū)別如下:

  • getMethods()

返回當(dāng)前類及其父類、接口中的所有公共方法(public)。

  • getDeclaredMethods()

僅返回當(dāng)前類中聲明的所有方法(包括私有、保護(hù)、默認(rèn)訪問(wèn)權(quán)限的方法),不包括繼承的方法。

示例:

class Parent {
    public void parentMethod() {}
}
class Child extends Parent {
    public void childMethod() {}
    private void privateMethod() {}
}
public class Main {
    public static void main(String[] args) {
        Class<?> clazz = Child.class;
        System.out.println("getMethods():");
        for (Method method : clazz.getMethods()) {
            System.out.println(method.getName());
        }
		System.out.println("=====================================");
        System.out.println("getDeclaredMethods():");
        for (Method method : clazz.getDeclaredMethods()) {
            System.out.println(method.getName());
        }
    }
}

輸出結(jié)果:

getMethods():
childMethod
parentMethod
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
=====================================
getDeclaredMethods():
childMethod
privateMethod

5. 實(shí)際應(yīng)用場(chǎng)景

getDeclaredMethods() 在以下場(chǎng)景中非常有用:

  • 動(dòng)態(tài)代理:通過(guò)反射獲取目標(biāo)類的方法,并動(dòng)態(tài)生成代理類。
  • 單元測(cè)試:測(cè)試私有方法時(shí),可以通過(guò)反射調(diào)用這些方法。
  • 框架開發(fā):如 Spring 框架中,通過(guò)反射解析注解并執(zhí)行相應(yīng)邏輯。
  • 代碼分析工具:分析類的方法結(jié)構(gòu),生成文檔或進(jìn)行代碼檢查。

6. 注意事項(xiàng)與常見問(wèn)題

  • 性能問(wèn)題

反射操作比直接調(diào)用方法要慢,因此在性能敏感的場(chǎng)景中應(yīng)謹(jǐn)慎使用。

  • 訪問(wèn)私有方法

如果需要調(diào)用私有方法,需要先調(diào)用 method.setAccessible(true) 來(lái)繞過(guò)訪問(wèn)權(quán)限檢查。

  • 安全管理器

如果啟用了安全管理器,可能會(huì)限制對(duì)某些方法的訪問(wèn),導(dǎo)致 SecurityException。

  • 繼承方法的缺失

getDeclaredMethods() 不會(huì)返回繼承的方法,如果需要獲取父類方法,可以使用 getMethods()

7. 總結(jié)

getDeclaredMethods() 是 Java 反射機(jī)制中的一個(gè)強(qiáng)大工具,它允許我們動(dòng)態(tài)地獲取類中聲明的所有方法。在實(shí)際開發(fā)中,合理使用反射可以極大地提高代碼的靈活性和可擴(kuò)展性,但也要注意其性能開銷和安全性問(wèn)題。

到此這篇關(guān)于Java 中的 getDeclaredMethods() 方法:使用與原理全攻略的文章就介紹到這了,更多相關(guān)java getDeclaredMethods() 方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot-JPA刪除不成功,只執(zhí)行了查詢語(yǔ)句問(wèn)題

    SpringBoot-JPA刪除不成功,只執(zhí)行了查詢語(yǔ)句問(wèn)題

    這篇文章主要介紹了SpringBoot-JPA刪除不成功,只執(zhí)行了查詢語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SSH原理及兩種登錄方法圖文詳解

    SSH原理及兩種登錄方法圖文詳解

    SSH(Secure Shell)是一套協(xié)議標(biāo)準(zhǔn),可以用來(lái)實(shí)現(xiàn)兩臺(tái)機(jī)器之間的安全登錄以及安全的數(shù)據(jù)傳送,其保證數(shù)據(jù)安全的原理是非對(duì)稱加密。本文通過(guò)圖文并茂的形式給大家介紹了SSH原理及兩種登錄方法,一起看看吧
    2018-08-08
  • 解析SpringBoot整合SpringDataRedis的過(guò)程

    解析SpringBoot整合SpringDataRedis的過(guò)程

    這篇文章主要介紹了SpringBoot整合SpringDataRedis的過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • springmvc HttpServletRequest 如何獲取c:forEach的值

    springmvc HttpServletRequest 如何獲取c:forEach的值

    這篇文章主要介紹了springmvc HttpServletRequest 如何獲取c:forEach的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中的Kotlin?內(nèi)部類原理

    Java中的Kotlin?內(nèi)部類原理

    這篇文章主要介紹了Java中的Kotlin?內(nèi)部類原理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • 使用stream的Collectors.toMap()方法常見的問(wèn)題及解決

    使用stream的Collectors.toMap()方法常見的問(wèn)題及解決

    這篇文章主要介紹了使用stream的Collectors.toMap()方法常見的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring Boot實(shí)現(xiàn)SSE實(shí)時(shí)推送實(shí)戰(zhàn)示例

    Spring Boot實(shí)現(xiàn)SSE實(shí)時(shí)推送實(shí)戰(zhàn)示例

    本文給大家介紹基于SpringBoot實(shí)現(xiàn)SSE示例,包括創(chuàng)建項(xiàng)目、SSE控制器處理連接與消息推送、跨域配置、客戶端使用EventSource訂閱,以及動(dòng)態(tài)推送和WebFlux擴(kuò)展,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • dm.jdbc.driver.DMException網(wǎng)絡(luò)通信異常的解決過(guò)程

    dm.jdbc.driver.DMException網(wǎng)絡(luò)通信異常的解決過(guò)程

    最近一個(gè)項(xiàng)目里面出現(xiàn)了一個(gè)比較詭異的問(wèn)題,給大家分享下,這篇文章主要給大家介紹了關(guān)于dm.jdbc.driver.DMException網(wǎng)絡(luò)通信異常的解決過(guò)程,需要的朋友可以參考下
    2023-02-02
  • 解決FontConfiguration.getVersion報(bào)空指針異常的問(wèn)題

    解決FontConfiguration.getVersion報(bào)空指針異常的問(wèn)題

    這篇文章主要介紹了解決FontConfiguration.getVersion報(bào)空指針異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java雪花算法的原理和實(shí)現(xiàn)方法

    Java雪花算法的原理和實(shí)現(xiàn)方法

    這篇文章主要介紹了Java雪花算法的原理和實(shí)現(xiàn)方法,雪花算法是一種分布式唯一ID生成算法,可以生成全局唯一的ID標(biāo)識(shí)符,就像自然界中雪花一般沒有相同的雪花,下面將詳細(xì)介紹,感興趣的可以學(xué)習(xí)一下
    2023-10-10

最新評(píng)論

金川县| 石狮市| 宣恩县| 永嘉县| 金昌市| 嘉善县| 宁乡县| 新晃| 方正县| 习水县| 万全县| 乌兰浩特市| 保康县| 丽江市| 天水市| 蓝山县| 商城县| 青川县| 徐闻县| 江西省| 温泉县| 瑞昌市| 钟山县| 海伦市| 绥中县| 灌阳县| 濮阳县| 娄烦县| 长海县| 渝北区| 凤庆县| 新巴尔虎右旗| 临颍县| 大田县| 克拉玛依市| 惠州市| 黎川县| 平昌县| 盈江县| 梧州市| 台南市|