Java進階-day06:反射、注解與動態代理深度解析

目錄

一、反射機制:Java的自我認知能力

1.1 認識反射

1.2 獲取Class對象

1.3 獲取類的成分

二、注解:Java的元數據機制

2.1 注解概述

2.2 元注解

2.3 注解解析

2.4 注解的實際應用

三、動態代理:靈活的間接訪問機制

3.1 為什么需要代理

3.2 Java動態代理實現

3.3 動態代理的實際應用

四、總結


一、反射機制:Java的自我認知能力

1.1 認識反射

反射(Reflection)是Java語言的一種強大特性,它允許程序在運行時獲取類的內部信息,并能直接操作類或對象的內部屬性和方法。這種"自我認知"能力打破了傳統編程的靜態模式,為Java帶來了極大的靈活性。

反射的核心思想是:在運行時而非編譯時確定和操作類的信息。這使得我們可以編寫出更加通用和靈活的代碼,但也帶來了性能開銷和安全考慮。

1.2 獲取Class對象

要使用反射,首先需要獲取類的Class對象,Java提供了三種方式:

// 1. 通過類名.class獲取
Class<String> stringClass = String.class;// 2. 通過對象.getClass()獲取
String str = "Hello";
Class<?> strClass = str.getClass();// 3. 通過Class.forName()動態加載
Class<?> arrayListClass = Class.forName("java.util.ArrayList");

1.3 獲取類的成分

獲取Class對象后,我們可以深入探索類的各個組成部分:

獲取構造方法:

Constructor<?>[] constructors = String.class.getConstructors();
Constructor<?> stringConstructor = String.class.getConstructor(String.class);

獲取字段信息:

Field[] fields = MyClass.class.getDeclaredFields();
Field nameField = MyClass.class.getDeclaredField("name");
nameField.setAccessible(true); // 突破私有訪問限制

獲取方法信息:

Method[] methods = MyClass.class.getDeclaredMethods();
Method method = MyClass.class.getMethod("setName", String.class);
Object result = method.invoke(obj, "newName"); // 調用方法

反射在實際開發中應用廣泛,如:

  • IDE的代碼提示功能

  • Spring框架的依賴注入

  • JUnit測試框架

  • 序列化/反序列化工具

二、注解:Java的元數據機制

2.1 注解概述

注解(Annotation)是Java 5引入的一種元數據機制,它提供了一種向代碼添加信息的方式,這些信息可以被編譯器、運行時環境或其他工具讀取和處理。

注解的本質是接口,它通過@interface關鍵字定義:

public @interface MyAnnotation {String value() default "";int priority() default 0;
}

2.2 元注解

元注解是用來注解其他注解的注解,Java提供了以下幾種:

  1. @Target:指定注解可以應用的目標(類、方法、字段等)

  2. @Retention:指定注解的保留策略(源碼、class文件、運行時)

  3. @Documented:指示注解應該被包含在JavaDoc中

  4. @Inherited:指示子類可以繼承父類的注解

  5. @Repeatable(Java 8+):允許在同一位置重復使用同一注解

2.3 注解解析

定義注解后,我們需要通過反射機制來解析和使用它們:

// 獲取類上的注解
MyAnnotation classAnnotation = MyClass.class.getAnnotation(MyAnnotation.class);// 獲取方法上的注解
Method method = MyClass.class.getMethod("someMethod");
MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);// 處理注解信息
if (methodAnnotation != null) {System.out.println("Value: " + methodAnnotation.value());System.out.println("Priority: " + methodAnnotation.priority());
}

2.4 注解的實際應用

注解在現代Java開發中無處不在:

  1. 框架配置:Spring的@Controller@Service

  2. 測試:JUnit的@Test@Before

  3. 持久化:JPA的@Entity@Column

  4. 代碼生成:Lombok的@Getter@Setter

  5. 驗證:Bean Validation的@NotNull@Size

三、動態代理:靈活的間接訪問機制

3.1 為什么需要代理

代理模式的核心思想是通過一個代理對象來控制對真實對象的訪問。在以下場景中代理特別有用:

  1. 訪問控制:限制對真實對象的直接訪問

  2. 功能增強:在不修改原始對象的情況下添加額外功能

  3. 延遲加載:當創建對象開銷很大時,推遲實際創建時間

  4. 日志記錄:自動記錄方法調用信息

  5. 事務管理:自動為方法調用添加事務支持

3.2 Java動態代理實現

Java提供了java.lang.reflect.Proxy類來創建動態代理:

// 1. 定義接口
public interface UserService {void addUser(String username);void deleteUser(String username);
}// 2. 實現接口
public class UserServiceImpl implements UserService {public void addUser(String username) {System.out.println("添加用戶: " + username);}public void deleteUser(String username) {System.out.println("刪除用戶: " + username);}
}// 3. 實現InvocationHandler
public class UserServiceProxy implements InvocationHandler {private Object target;public UserServiceProxy(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("準備執行: " + method.getName());Object result = method.invoke(target, args);System.out.println("執行完成: " + method.getName());return result;}
}// 4. 使用代理
public class Main {public static void main(String[] args) {UserService realService = new UserServiceImpl();UserService proxy = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),new Class[]{UserService.class},new UserServiceProxy(realService));proxy.addUser("張三");proxy.deleteUser("李四");}
}

3.3 動態代理的實際應用

  1. Spring AOP:基于動態代理實現面向切面編程

  2. RPC框架:遠程方法調用的本地代理實現

  3. MyBatis:Mapper接口的代理實現

  4. Hibernate:延遲加載的代理實現

  5. 日志系統:自動化的方法調用日志記錄

四、總結

反射、注解和動態代理是Java高級編程中的三大核心技術,它們共同構成了Java靈活性和擴展性的基礎:

  1. 反射:賦予Java程序在運行時自省和操作類結構的能力

  2. 注解:為Java代碼提供強大的元數據支持

  3. 動態代理:實現了靈活的間接訪問和功能增強機制

這些技術雖然強大,但也應謹慎使用:

  • 反射會帶來性能開銷和安全風險

  • 過度使用注解可能導致代碼可讀性下降

  • 動態代理可能掩蓋真實的調用流程

理解并合理運用這些高級特性,能夠幫助我們構建更加靈活、可擴展的Java應用程序,也是深入理解主流Java框架的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75690.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nacos注冊中心AP模式核心源碼分析(集群模式)

文章目錄 概述一、客戶端新注冊實例信息在集群間同步二、服務端集群節點信息在集群間同步2.1、DistroMapper2.2、ProtocolManager2.3、ServerListManager2.4、RaftPeerSet 三、客戶端實例狀態信息在集群間同步四、服務端新節點上線同步集群數據 概述 在Nacos集群模式下&#xf…

vscode和cursor對ubuntu22.04的remote ssh和X-Windows的無密碼登錄

這里寫自定義目錄標題 寫在前面需求的描述問題的引出 昨天已使能自動登錄上午我的改變UBUNTU 22.04關閉密碼規則一&#xff1a;修改 /etc/pam.d/common-password 文件二&#xff1a;修改 /etc/security/pwquality.conf 文件方法三&#xff1a;禁用 pam_pwquality.so 模塊 vscod…

論文閱讀:基于增強通用深度圖像水印的混合篡改定位技術 OmniGuard

一、論文信息 論文名稱:OmniGuard: Hybrid Manipulation Localization via Augmented Versatile Deep Image Watermarking作者團隊:北京大學發表會議:CVPR2025論文鏈接:https://arxiv.org/pdf/2412.01615二、動機與貢獻 動機: 隨著生成式 AI 的快速發展,其在圖像編輯領…

一周學會Pandas2 Python數據處理與分析-NumPy數組創建

鋒哥原創的Pandas2 Python數據處理與分析 視頻教程&#xff1a; 2025版 Pandas2 Python數據處理與分析 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili NumPy數組創建最常用的方式是直接創建&#xff0c; numpy 可以直接創建或者將 python的其他元素轉為 array 對象。 下…

【全球首發】DeepSeek谷歌版1.1.5 - 免費GPT-4級別AI工具

【全球首發】DeepSeek谷歌版1.1.5 - 免費GPT-4級別AI工具 資源簡介 DeepSeek谷歌版1.1.5是目前全球領先的免費AI助手&#xff0c;性能超越國內主流AI產品&#xff0c;提供類似GPT-4的智能體驗。 版本信息 最新版本&#xff1a;1.1.5&#xff08;2024最新版&#xff09;應用…

小程序29-事件穿參-mark 自定義數據

小程序進行事件傳參的時候&#xff0c;除了使用 data-*屬性 傳遞參數外&#xff0c;還可以 使用 mark 標記傳遞參數 mark 是一種自定義屬性&#xff0c;可以在組件上添加&#xff0c;用于來識別具體觸發事件的 target 節點。同時 mark 還可以用于承載一些自定義數據 在組件上使…

高級:分布式系統面試題精講

一、引言 分布式系統在現代軟件開發中占據重要地位&#xff0c;其設計和實現需要考慮多個關鍵因素。面試官通過相關問題&#xff0c;考察候選人對分布式系統核心概念的理解、實際應用能力以及在復雜場景下的問題解決能力。本文將深入分析分布式系統的CAP定理、一致性協議、分布…

【Android Studio 下載 Gradle 失敗】

路雖遠行則將至&#xff0c;事雖難做則必成 一、事故現場 下載Gradle下載不下來&#xff0c;沒有Gradle就無法把項目編譯為Android應用。 二、問題分析 觀察發現下載時長三分鐘&#xff0c;進度條半天沒動&#xff0c;說明這個是國外的東西&#xff0c;被墻住了&#xff0c;需…

系統思考:思考的快與慢

在做重大決策之前&#xff0c;什么原因一定要補充碳水化合物&#xff1f;人類的大腦其實有兩套運作模式&#xff1a;系統1&#xff1a;自動駕駛模式&#xff0c;依賴直覺&#xff0c;反應快但易出錯&#xff1b;系統2&#xff1a;手動駕駛模式&#xff0c;理性嚴謹&#xff0c;…

從情感分析到樸素貝葉斯法:基于樸素貝葉斯的情感分析如何讓DeepSeek賦能你的工作?

文章目錄 1.概率論基礎1.1 單事件概率1.2 多事件概率1.3 條件概率1.3.1 多事件概率與條件概率的區別 1.4 貝葉斯定理傳統思維誤區貝葉斯定理計算 2. 樸素貝葉斯法2.1 基本概念2.2 模型2.3 學習策略2.4 優化算法2.5 優化技巧拉普拉斯平滑對數似然 3. 情感分析實戰3.1 流程3.2 模…

獲取inode的完整路徑包含掛載的路徑

一、背景 在之前的博客 缺頁異常導致的iowait打印出相關文件的絕對路徑-CSDN博客 里的 2.2.3 一節和 關于inode&#xff0c;dentry結合軟鏈接及硬鏈接的實驗-CSDN博客 里&#xff0c;我們講到了在內核里通過inode獲取inode對應的絕對路徑的方法。對于根目錄下的文件而言&#…

【51單片機】2-6【I/O口】【電動車簡易防盜報警器實現】

1.硬件 51最小系統繼電器模塊震動傳感器模塊433M無線收發模塊 2.軟件 #include "reg52.h" #include<intrins.h> #define J_ON 1 #define J_OFF 0sbit switcher P1^0;//繼電器 sbit D0_ON P1^1;//433M無線收發模塊 sbit D1_OFF P1^2; sbit vibrate …

leetcode二叉樹刷題調試不方便的解決辦法

1. 二叉樹不易構建 在leetcode中刷題時&#xff0c;如果沒有會員就需要將代碼拷貝到本地的編譯器進行調試。但是leetcode中有一類題可謂是毒瘤&#xff0c;那就是二叉樹的題。 要調試二叉樹有關的題需要根據測試用例給出的前序遍歷&#xff0c;自己構建一個二叉樹&#xff0c;…

藍橋杯嵌入式客觀題二

十四屆模擬一 1. 2.串口通信是一種傳輸線按位數據順序傳輸方式 3.USART_SR是屬于STM32微控制器USART的狀態寄存器。 4.STM32G431RBT6是32位的ARM微控制器 ARM處理器是英國ARM公司設計的一種低功耗RISC微處理器 5.中斷配置?EXTI->FTSR&#xff08;下降沿觸發選擇寄存器…

OrangePi入門教程(待更新)

快速上手指南 https://www.hiascend.com/developer/techArticles/20240301-1?envFlag1 教學課程(含開發板配置和推理應用開發) https://www.hiascend.com/developer/devboard 開發推理應用 https://www.hiascend.com/developer/techArticles/20240326-1?envFlag1

王者榮耀的游戲匹配機制

王者榮耀的匹配機制主要基于ELO評分系統&#xff08;隱藏分機制&#xff09;和段位匹配&#xff0c;旨在平衡對局雙方實力&#xff0c;同時通過多種策略控制玩家勝率趨近50%。 一、匹配機制核心 1. ELO評分&#xff08;隱藏分&#xff09; - 系統根據玩家的勝負、KDA、傷害量、…

PPTAgent:一款開源免費生成和評估幻燈片的項目

這篇文章介紹一下PPTAgent&#xff0c;一個從文檔自動生成演示文稿的創新系統。該系統從人類的展示創作方法中汲取靈感&#xff0c;采用兩步流程來確保卓越的整體質量。此外&#xff0c;本文還介紹了PPTEval&#xff0c;這是一個綜合評估框架&#xff0c;可以跨多個維度評估演示…

谷歌開源單個 GPU 可運行的Gemma 3 模型,27B 超越 671B 參數的 DeepSeek

自從 DeepSeek 把訓練成本打下來之后&#xff0c;各個模型廠家現在不再堆參數進行模型的能力對比。而是轉向了訓練成本優化方面&#xff0c;且還要保證模型能力不減反增的效果。包括使用較少的模型參數&#xff0c;降低 GPU 使用數量&#xff0c;降低模型內存占用等等技術手段。…

回歸預測 | Matlab實現NRBO-Transformer-LSTM多輸入單輸出回歸預測

回歸預測 | Matlab實現NRBO-Transformer-LSTM多輸入單輸出回歸預測 目錄 回歸預測 | Matlab實現NRBO-Transformer-LSTM多輸入單輸出回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.【JCR一區級】Matlab實現NRBO-Transformer-LSTM多輸入單輸出回歸預測&#xf…

Photoshop 2025 Mac中文Ps圖像編輯

Photoshop 2025 Mac中文Ps圖像編輯 文章目錄 Photoshop 2025 Mac中文Ps圖像編輯一、介紹二、效果三、下載 一、介紹 Adobe Photoshop 2025 Mac版集成了多種強大的圖像編輯、處理和創作功能。①強化了Adobe Sensei AI的應用&#xff0c;通過智能摳圖、自動修復、圖像生成等功能…