day24——Java高級技術深度解析:單元測試、反射、注解與動態代理

文章目錄

    • 一、單元測試:JUnit框架精要
      • 1.1 單元測試核心概念
      • 1.2 JUnit快速入門實戰
        • 基礎步驟:
        • 斷言機制驗證結果
      • 1.3 JUnit核心注解解析
    • 二、反射機制:框架設計的基石
      • 2.1 反射核心概念
      • 2.2 獲取Class對象的三種方式
      • 2.3 反射操作類成分
        • 獲取并執行構造器
        • 操作成員變量
        • 調用成員方法
      • 2.4 反射高級應用
        • 突破泛型限制
        • 開發通用對象框架
    • 三、注解:元編程利器
      • 3.1 注解基礎概念
      • 3.2 元注解:注解的注解
      • 3.3 注解解析實戰
      • 3.4 反射應用場景:模擬JUnit測試框架
    • 四、動態代理:優雅的增強方案
      • 4.1 代理模式核心思想
      • 4.2 JDK動態代理實現
        • 定義接口與實現類
        • 創建代理工具類
        • 使用代理對象
      • 4.3 動態代理應用:性能監控
    • 五、總結:四大技術的關聯與應用

本文全面解析Java高級技術核心內容:單元測試、反射機制、注解應用與動態代理實現,通過理論講解與代碼實踐助你掌握框架底層原理

一、單元測試:JUnit框架精要

1.1 單元測試核心概念

單元測試是針對**最小功能單元(方法級別)**編寫的測試代碼,用于驗證功能正確性。傳統main方法測試存在三大痛點:

  • 無法靈活選擇測試方法
  • 不能自動生成測試報告
  • 測試過程無法自動化

JUnit作為第三方開源測試框架,完美解決了這些問題:

  • ? 支持選擇性執行測試方法或批量執行
  • ? 自動生成可視化測試報告(綠色成功/紅色失敗)
  • ? 高度靈活的測試代碼編寫

1.2 JUnit快速入門實戰

基礎步驟:
  1. 創建測試類
  2. 編寫公共無參無返回值的測試方法
  3. 使用@Test注解標記測試方法(idea 可以直接導入,Alt+Enter)
  4. 在測試方法中調用被測代碼(在@Test的方法任務地方右擊,點擊run 方法名)
// StringUtil工具類
public class StringUtil {public static void printNumber(String name) {System.out.println("名字長度:" + name.length());}
}// 測試類
public class StringUtilTest {@Testpublic void testPrintNumber() {StringUtil.printNumber("admin");StringUtil.printNumber(null); // 測試異常情況}
}
斷言機制驗證結果
@Test
public void testGetMaxIndex() {int index = StringUtil.getMaxIndex("admin");// 斷言預測結果:期望值4, 實際值indexAssert.assertEquals("方法內部有Bug", 4, index);
}

注意:很多個測試類中多個測試方法,可以直接點擊項目,右擊run ‘All Tests’
在這里插入圖片描述
在這里插入圖片描述

1.3 JUnit核心注解解析

注解JUnit4JUnit5執行時機
初始化@Before@BeforeEach每個@Test方法執行
清理@After@AfterEach每個@Test方法執行
全局初始化@BeforeClass@BeforeAll所有測試方法執行(static)
全局清理@AfterClass@AfterAll所有測試方法執行(static)

資源管理實戰:

public class ResourceTest {private static Socket socket;@BeforeClasspublic static void init() {socket = new Socket(); // 初始化資源}@AfterClasspublic static void cleanup() {socket.close(); // 釋放資源}@Testpublic void testNetwork() {// 使用socket進行測試}
}

二、反射機制:框架設計的基石

2.1 反射核心概念

反射是在運行時獲取類的字節碼對象(Class對象),并動態解析類的全部成分:

  • 🏗? 構造器(Constructor對象)
  • 📦 成員變量(Field對象)
  • ?? 成員方法(Method對象)

應用場景:

  • IDE代碼提示功能
  • Spring框架的IoC容器
  • MyBatis的ORM映射
  • 通用工具類開發

2.2 獲取Class對象的三種方式

// 1. 類名.class
Class c1 = Student.class;// 2. Class.forName("全類名")
Class c2 = Class.forName("com.example.Student");// 3. 對象.getClass()
Student s = new Student();
Class c3 = s.getClass();System.out.println(c1 == c2); // true
System.out.println(c2 == c3); // true

在這里插入圖片描述

2.3 反射操作類成分

獲取并執行構造器
Class<Cat> catClass = Cat.class;// 獲取私有構造器
Constructor<Cat> constructor = catClass.getDeclaredConstructor(String.class, int.class);// 暴力反射(解除私有限制)
constructor.setAccessible(true); // 執行構造器創建實例
Cat cat = constructor.newInstance("Tom", 3);

在這里插入圖片描述

操作成員變量

在這里插入圖片描述

Field nameField = catClass.getDeclaredField("name");
nameField.setAccessible(true);// 設置字段值
nameField.set(cat, "Jerry");// 獲取字段值
String name = (String) nameField.get(cat);

在這里插入圖片描述

調用成員方法

在這里插入圖片描述

Method runMethod = catClass.getDeclaredMethod("run");
runMethod.setAccessible(true);// 調用無參方法
runMethod.invoke(cat);// 調用有參方法
Method eatMethod = catClass.getDeclaredMethod("eat", String.class);
eatMethod.setAccessible(true);
String result = (String) eatMethod.invoke(cat, "fish");

2.4 反射高級應用

突破泛型限制
// 編譯時泛型檢查
ArrayList<Integer> list = new ArrayList<>();
list.add(100);
// list.add("字符串"); // 編譯報錯// 運行時通過反射繞過泛型檢查
Method addMethod = ArrayList.class.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "字符串"); // 成功添加
開發通用對象框架

在這里插入圖片描述

public class ObjectFrame {public static void saveObject(Object obj) throws Exception {Class<?> c = obj.getClass();Field[] fields = c.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);//禁止檢查訪問控制String fieldName = field.getName();Object value = field.get(obj);// 寫入字段名和值到文件}}
}// 使用示例
Student stu = new Student("張三", 20);
ObjectFrame.saveObject(stu);

在這里插入圖片描述

三、注解:元編程利器

3.1 注解基礎概念

注解(Annotation)是JDK5引入的代碼標記機制,用于對類、方法、字段等進行標注。核心作用:

  • 🔖 標記程序元素
  • 💡 提供元數據信息
  • ?? 驅動特殊處理邏輯

自定義注解格式:
在這里插入圖片描述
在這里插入圖片描述

public @interface MyAnnotation {// 屬性聲明String value(); int count() default 1;String[] tags();
}

在這里插入圖片描述

3.2 元注解:注解的注解

在這里插入圖片描述

元注解用于修飾自定義注解:

元注解作用常用值
@Target指定注解使用范圍TYPE, FIELD, METHOD等
@Retention指定注解生命周期SOURCE, CLASS, RUNTIME
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {String value(); // 書名double price() default 100;String[] authors(); // 作者數組
}

3.3 注解解析實戰

在這里插入圖片描述

@Book(value = "Java核心技術", authors = {"Cay S. Horstmann"})
public class Textbook {@Book(value = "Effective Java", price = 128.0, authors = {"Joshua Bloch"})public void recommend() {}
}// 解析類注解
Class<Textbook> clazz = Textbook.class;
if (clazz.isAnnotationPresent(Book.class)) {Book book = clazz.getAnnotation(Book.class);System.out.println("書名: " + book.value());
}// 解析方法注解
Method method = clazz.getMethod("recommend");
if (method.isAnnotationPresent(Book.class)) {Book book = method.getAnnotation(Book.class);System.out.println("價格: " + book.price());
}

3.4 反射應用場景:模擬JUnit測試框架

在這里插入圖片描述

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTest {}public class TestRunner {public static void main(String[] args) throws Exception {Class<?> testClass = MyTestClass.class;Object instance = testClass.newInstance();for (Method method : testClass.getDeclaredMethods()) {if (method.isAnnotationPresent(MyTest.class)) {method.invoke(instance); // 執行測試方法}}}
}

四、動態代理:優雅的增強方案

在這里插入圖片描述

4.1 代理模式核心思想

當目標對象無法或不想直接完成操作時,通過代理對象控制對目標對象的訪問

  • 💼 代理對象持有目標對象引用
  • 🔄 代理對象攔截方法調用
  • ? 在方法執行前后添加額外操作

4.2 JDK動態代理實現

定義接口與實現類
public interface Star {String sing(String song);void dance();
}public class BigStar implements Star {private String name;public BigStar(String name) {this.name = name;}@Overridepublic String sing(String song) {return name + "演唱:" + song;}@Overridepublic void dance() {System.out.println(name + "跳舞");}
}
創建代理工具類
public class ProxyUtil {public static Star createProxy(BigStar target) {return (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{Star.class},(proxy, method, args) -> {// 前置增強if ("sing".equals(method.getName())) {System.out.println("準備話筒,收費20萬");} else if ("dance".equals(method.getName())) {System.out.println("準備場地,收費100萬");}// 調用目標方法Object result = method.invoke(target, args);// 后置增強System.out.println("表演結束,結算費用");return result;});}
}
使用代理對象
public static void main(String[] args) {BigStar star = new BigStar("楊超越");Star proxy = ProxyUtil.createProxy(star);String result = proxy.sing("卡路里");System.out.println(result);proxy.dance();
}

4.3 動態代理應用:性能監控

public class PerformanceProxy {public static UserService createProxy(UserService target) {return (UserService) Proxy.newProxyInstance(PerformanceProxy.class.getClassLoader(),new Class[]{UserService.class},(proxy, method, args) -> {long start = System.currentTimeMillis();Object result = method.invoke(target, args);long end = System.currentTimeMillis();System.out.println(method.getName() + "方法執行耗時: " + (end - start) + "ms");return result;});}
}// 使用示例
UserService userService = new UserServiceImpl();
UserService proxy = PerformanceProxy.createProxy(userService);
proxy.login("admin", "123456");

五、總結:四大技術的關聯與應用

技術核心能力典型應用場景
單元測試自動化驗證代碼邏輯保障代碼質量,回歸測試
反射運行時動態解析類結構框架設計,動態代碼生成
注解聲明式配置程序元素簡化配置,驅動框架行為
動態代理無侵入增強對象功能AOP實現,性能監控,事務管理

技術聯動示例:

  1. 使用注解標記測試方法(@Test)
  2. 通過反射解析測試類信息
  3. 利用動態代理增強測試方法(添加事務控制)
  4. 通過單元測試驗證功能正確性

掌握這四大Java高級技術,不僅能編寫更健壯高效的代碼,更能深入理解主流框架的設計思想,為成為架構師奠定堅實基礎。

學習建議:

  1. 先掌握單元測試保證代碼質量
  2. 深入理解反射機制原理
  3. 練習自定義注解及解析
  4. 動手實現動態代理案例
  5. 研究Spring等框架的源碼實現

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

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

相關文章

網頁的性能優化,以及具體的應用場景

下面是每個性能優化技術的具體應用場景示例&#xff0c;結合代碼說明如何在實際項目中使用這些優化方法&#xff1a; 1. 批量DOM操作與DocumentFragment 應用場景&#xff1a;動態渲染大量列表項&#xff08;如評論區、商品列表&#xff09; 問題&#xff1a;逐個添加DOM元素會…

Fiddler 中文版 API 調試與性能優化實踐 官方中文網全程支持

在現代開發中&#xff0c;性能問題往往是產品上線后最容易被忽視的一環&#xff0c;尤其是API接口性能。一旦接口響應時間過長或在高并發場景下出現性能瓶頸&#xff0c;可能直接影響用戶體驗和系統穩定性。對于開發者來說&#xff0c;如何精確地找到瓶頸所在&#xff0c;如何模…

嵌入式硬件篇---機械臂運動學解算(3自由度)

實際 3 自由度機械臂的解算是機器人控制的核心&#xff0c;涉及運動學正解&#xff08;關節角度→末端位姿&#xff09;和逆解&#xff08;目標位姿→關節角度&#xff09;。以下從結構建模、解算方法、代碼實現和應用場景四個維度詳細展開&#xff0c;結合工業級機械臂的典型場…

在攝像機視圖中想像在普通 3D 視口里那樣隨意移動

有兩條最常用的方法&#xff1a;1. 「鎖定相機到視圖」(Lock Camera to View)步驟進入相機視圖&#xff1a;按 Numpad 0&#xff08;若無數字鍵盤&#xff0c;可在 Edit → Preferences → Input 勾選 Emulate Numpad 后用主鍵盤 0&#xff09;。右側呼出 N 面板&#xff0c;切…

An End-to-End Attention-Based Approach for Learning on Graphs NC 2025

NC 2025 | 一種基于端到端注意力機制的圖學習方法 Nature Communications IF=15.7 綜合性期刊 1區 參考:https://mp.weixin.qq.com/s/cZ-d8Sf8wtQ9wfcGOFimCg 今天介紹一篇發表在 Nature Communications 的圖學習論文《An end-to-end attention-based approach for learnin…

【牛客刷題】小紅的數字串

文章目錄 一、題目描述 1.1 輸入描述 1.2 輸出描述 1.3 示例1 二、高效解法 2.1 核心算法設計 2.2 算法設計理念 2.2.1 算法流程詳解 2.2.2 復雜度分析 2.3 算法優勢分析 2.3.1 關鍵優化點 2.3.2 正確性驗證 2.4 邊界處理 2.5 總結與擴展 一、題目描述 小紅拿到了一個數字串(由…

微算法科技技術創新,將量子圖像LSQb算法與量子加密技術相結合,構建更加安全的量子信息隱藏和傳輸系統

隨著信息技術的發展&#xff0c;數據的安全性變得尤為重要。在傳統計算模式下&#xff0c;即便采用復雜的加密算法&#xff0c;也難以完全抵御日益增長的網絡攻擊威脅。量子計算技術的出現為信息安全帶來了新的解決方案。然而&#xff0c;量子圖像處理領域仍面臨復雜度高、效率…

博客摘錄「 Springboot入門到精通(超詳細文檔)」2025年7月4日

1.Spring Boot返回Json數據及數據封裝1. Controller 中使用RestController注解即可返回 Json 格式的數據首先看看RestController注解包含了什么東西&#xff0c; ResponseBody 注解是將返回的數據結構轉換為 Json 格式Target({ElementType.TYPE}) Retention(RetentionPolicy.RU…

企業安全防護:堡壘機技術解析

目錄 一、堡壘機&#xff1a;企業IT運維的安全守門人 1.1 核心價值矩陣 1.2堡壘機典型部署架構 二、堡壘機如何構建安全防線 2.1 四層防護體系 2.2 關鍵工作流程 三、堡壘機關鍵技術指標對比表 四、智能堡壘機的發展趨勢 一、堡壘機&#xff1a;企業IT運維的安全守門人…

傳輸層協議 TCP

TCP 協議TCP 全稱為 "傳輸控制協議(Transmission Control Protocol"). 人如其名, 要對數據的傳輸進行一個詳細的控制TCP 協議段格式源/目的端口號: 表示數據是從哪個進程來, 到哪個進程去32 位序號/32 位確認號4 位 TCP 報頭長度: 表示該 TCP 頭部有多少個 32 位 bit…

RT-Thread的概念和移植

一、操作系統的概念 操作系統&#xff08;英語&#xff1a;Operating System&#xff0c;縮寫&#xff1a;OS&#xff09;是一組主管并控制計算機操作、運用和運行硬件、軟件資源和提供公共服務來組織用戶交互的相互關聯的系統軟件程序。根據運行的環境&#xff0c;操作系統可以…

基于單片機傾角測量儀/角度測量/水平儀

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的高精度數字傾角測量儀。系統核心由傾角傳感器&#xff08;ADXL345傾…

深度學習 -- 初步認識Torch

深度學習 – 初步認識Torch 文章目錄深度學習 -- 初步認識Torch一&#xff0c;認識人工智能1.1 人工智能的本質1.2 人工智能的實現過程二&#xff0c;認識Torch2.1簡介2.2 概述2.3 Tensor的創建2.3.1 torch.tensor2.3.2 torch.Tensor三&#xff0c;創建線性和隨機張量3.1創建線…

BGP的“聰明選路”遇上了TCP的“路徑潔癖”,需人工調和

在路由器R1上有兩條外網&#xff0c;WAN1和WAN2。R1上做了域名分流功能&#xff0c;全局網址分到WAN1&#xff0c;指定域名分到WAN2&#xff08;優先級更高&#xff09;。癥狀是用戶反饋部分網頁無法打開。于是各種檢查嘗試...... 2天過去了......最終結論是&#xff1a;即使S…

ACWing算法筆記 | 二分

&#x1f50d; C 二分查找雙模板詳解&#xff1a;左閉右開 vs 左閉右閉&#xff08;二分筆記&#xff09;二分查找&#xff08;Binary Search&#xff09;是一類高效的搜索算法&#xff0c;在 O(log n) 的時間復雜度下查找答案&#xff0c;適用于單調性問題。C STL 的 lower_bo…

centos 新加磁盤分區動態擴容

你不能直接將一個分區分配給/dev/mapper/centos-root&#xff0c;因為這是一個邏輯卷&#xff08;屬于 LVM 系統&#xff09;。不過&#xff0c;你可以通過以下步驟將/dev/sda3添加到現有卷組或創建新的邏輯卷&#xff1a; 確認磁盤和分區信息 首先檢查分區是否已格式化以及是否…

python學智能算法(二十六)|SVM-拉格朗日函數構造

【1】引言 前序學習進程中&#xff0c;已經了解了拉格朗日乘數法求極值的基本原理&#xff0c;也了解了尋找最佳超平面就是尋找最佳分隔距離。 這篇文章的學習目標是&#xff1a;使用拉格朗日乘數法獲取最佳的分隔距離。 【2】構造拉格朗日函數 目標函數 首先是目標函數f&a…

智能制造——48頁畢馬威:汽車營銷與研發數字化研究【附全文閱讀】

涵蓋了汽車行業數字化轉型、汽車營銷業務能力建設&#xff08;以會員管理為例&#xff09;以及汽車研發與創新能力建設等議題。畢馬威認為&#xff0c;軟件定義汽車已成為汽車行業中的核心議題&#xff0c;并圍繞此議題提供了相關方案。在市場觀點方面&#xff0c;畢馬威與多家…

嵌入式學習-PyTorch(8)-day24

torch.optim 優化器torch.optim 是 PyTorch 中用于優化神經網絡參數的模塊&#xff0c;里面實現了一系列常用的優化算法&#xff0c;比如 SGD、Adam、RMSprop 等&#xff0c;主要負責根據梯度更新模型的參數。&#x1f3d7;? 核心組成1. 常用優化器優化器作用典型參數torch.op…

PostgreSQL實戰:高效SQL技巧

PostgreSQL PG 在不同領域可能有不同的含義,以下是幾種常見的解釋: PostgreSQL PostgreSQL(簡稱 PG)是一種開源的關系型數據庫管理系統(RDBMS),支持 SQL 標準并提供了豐富的擴展功能。它廣泛應用于企業級應用、Web 服務和數據分析等領域。 PostgreSQL 的詳細介紹 Po…