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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…