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.mzph.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;通过智能抠图、自动修复、图像生成等功能…