day24——Java高级技术深度解析:单元测试、反射、注解与动态代理 - 指南

news/2025/9/29 9:37:39/文章来源:https://www.cnblogs.com/lxjshuju/p/19118155

文章目录

    • 一、单元测试: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 {
@Test
public void testPrintNumber() {
StringUtil.printNumber("admin");
StringUtil.printNumber(null); // 测试异常情况
}
}
断言机制验证结果
@Test
public void testGetMaxIndex() {
int index = StringUtil.getMaxIndex("admin");
// 断言预测结果:期望值4, 实际值index
Assert.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;
@BeforeClass
public static void init() {
socket = new Socket(); // 初始化资源
}
@AfterClass
public static void cleanup() {
socket.close(); // 释放资源
}
@Test
public void testNetwork() {
// 使用socket进行测试
}
}

二、反射机制:框架设计的基石

2.1 反射核心概念

反射是在运行时获取类的字节码对象(Class对象),并动态解析类的全部成分:

应用场景:

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;
}
@Override
public String sing(String song) {
return name + "演唱:" + song;
}
@Override
public 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.mzph.cn/news/921639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程互斥的硬件实现方式(比较难懂的一节课,但是我搞懂了)

中断屏蔽方法 利用开关中断指令实现 关中断后,不允许当前进程被中断,也就不会发生进程切换 优点:简单高效 缺点:不适用于多处理机,只适用于操作系统内核进程,不适合于用户进程(因为开关中断指令只运行于内核态)…

详细介绍:Spring MVC 请求执行流程详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

GreenPlum - commit

GreenPlum - commit在Python代码中执行完insert, delete, update后要执行conn.commit()才能生效,truncate语句之后也要执行conn.commit(),否则truncate不生效。

【征文计划】基于Rokid眼镜平台的AR历史情景课堂创意应用 - 指南

【征文计划】基于Rokid眼镜平台的AR历史情景课堂创意应用 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

忍了一年,我的SAAS CRM终于到期了!

导读:当标准化模板遇上个性化需求,这场“将就”的婚姻终于走到尽头。本文揭秘为何90%的企业最终会放弃通用型SaaS CRM,转向私有部署+深度定制的解决方案。🌈 初见倾心:被颜值欺骗的开始 去年这时,我像捡到宝一样…

最好旅游网站建设深圳南山做网站公司

https://blog.csdn.net/wochunyang/article/details/84776813

Aduro电涌保护器特惠:6口插座与2USB端口52%折扣

本文介绍Aduro电涌保护器特惠活动,详细解析其6个AC插座和2个USB端口的技术规格,包括15安培/120伏特承载能力、2.4安培USB总输出及保护状态指示灯功能,同时讨论USB充电功率限制和使用注意事项。特惠信息 今日特惠为A…

centos 网卡IPv6配置

编辑网卡vi /etc/sysconfig/network-scripts/ifcfg-ens192IPV6INIT=yesIPV6ADDR=2001:db8::2/64IPV6_DEFAULTGW=2001:db8::1IPV6_DEFROUTE=yes # 关键!确保启用默认路由编辑后wq保存退出,重启网

华清远见携STM32全矩阵产品及创新机器狗亮相2025 STM32研讨会,共启嵌入式工艺探索新程

华清远见携STM32全矩阵产品及创新机器狗亮相2025 STM32研讨会,共启嵌入式工艺探索新程2025-09-29 09:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; …

免费发布网站html

腾讯云edgeone免费发布网站链接 https://console.cloud.tencent.com/edgeone/pages 在页面点击创建项目有三个选项1.导入 Git 仓库2.从模板开始3.直接上传(如果看不懂选第三个)把你的html文件传上去就好了如不懂可以扫…

IPD和PLM谁先谁后

IPD和PLM谁先谁后在IPD项目前期交流阶段、实施过程中、或者实施后,客户常常提出这些问题:如何提高IPD体系的运行效率? 信息系统如何支撑IPD? IPD如何与PLM结合? 这两个体系的建设应当如何进行? 两个系统的建设是…

卖房网站排名网站建设可行性实施报告

目录 前言 1、字符指针 2、指针数组 3、数组指针 3.1数组指针 3.2&数组名VS数组名 3.3数组指针的使用 4、数组参数、指针参数 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指针传参 4.5总结 5、函数指针 5.1思考 总结 前言 我们在之前知道指针…

母线操作术语

1、操作术语:(1)倒母线:是指双母线接线方式的变电站(开关站)将一组母线上的部分或全部开关倒换到另一组母线上运行或热备用的操作。(2)倒负荷:是指将线路或变压器负荷转移至其他线路或变压器供电的操作。 2、母…

PySimpleGUI中常见功能元素和函数缩写形式示例

以下是PySimpleGUI中常见功能元素和函数缩写形式的具体代码示例,涵盖基础控件、弹窗、窗口操作等场景,附带详细注释说明:1. 基础元素缩写示例 文本与输入框 import PySimpleGUI as sglayout = [[sg.T("用户名:…

简约网站后台WordPress主题VR插件

1. 京东云擎(http://jae.jd.com)提供了免费的个人博客WordPress一键安装功能了&#xff0c;如下图&#xff0c;给开发者分享福利&#xff01; 免费的应用&#xff0c;提供了源码&#xff0c;提供了数据库&#xff1a; 我之前把文章发到首页&#xff0c;遭到了封杀&#xff01;本…

【Linux指令 (一)】Linux 命令行入门:从零开始理解Linux平台理论核心概念与基础指令

【Linux指令 (一)】Linux 命令行入门:从零开始理解Linux平台理论核心概念与基础指令pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

PySimpleGUI有哪些功能元素和函数缩写形式

在PySimpleGUI中,确实存在许多元素和函数的缩写形式,这些缩写通常用于简化代码并提高开发效率。不过,PySimpleGUI并没有一个官方的、完整的缩写列表,因为缩写形式可能会随着库的更新而变化,且部分缩写是开发者根据…

建材龙头东鹏控股:以CRM打造数字化增长新引擎

近日,“走进数字化游学示范基地家居建材领军企业——东鹏控股”活动成功举办。活动通过实地参访、前沿业务战略解码、数字化实践经验分享的多元形式,展现了东鹏控股以数字化重构渠道管理、赋能业务增长的破局之路。“…

科技设计公司网站模板特殊符号网名生成器

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第四篇笔记&#xff0c;上一篇传送门。 复合电介质材料 是由多种成分共同组成&#xff0c;例如油纸复合绝缘、云母层压板、环氧浸渍玻璃纤维布等。即便是没有添加的材料&#xff0c;材料也会存在杂质和…

平顶山哪里有做网站的公司嵌入式软件开发文档

一、下载Nginx 首先&#xff0c;确保你的服务器上已经安装了Nginx&#xff0c;使用编译安装&#xff0c;下载最新版Nginx。 wget https://nginx.org/download/nginx-1.25.3.tar.gz tar -xf nginx-1.25.3.tar.gz二、安装Fancyindex和Nginx-Fancyindex-Theme模块 # 下载Fancyin…