当前位置: 首页 > news >正文

深入理解 Java 的反射、注解与动态代理


在 Java 的高级特性中,反射(Reflection)注解(Annotation)动态代理(Dynamic Proxy) 是构建框架、实现 AOP、ORM 等重要机制的基础。本文将逐一详解这三大特性,并辅以代码示例,帮助你在实际项目中更好地理解和运用它们。


一、反射:运行时的自省与操作能力

1.1 反射是什么?

反射是 Java 提供的一种机制,允许程序在运行时加载、探查以及操作类的结构(如方法、构造器、字段等)。

1.2 基本 API 使用

public class Person {private String name;private int age;public Person() {}public Person(String name) {this.name = name;}private void sayHello() {System.out.println("Hello, my name is " + name);}
}
获取类对象的三种方式:
Class<?> clazz1 = Person.class;
Class<?> clazz2 = new Person().getClass();
Class<?> clazz3 = Class.forName("your.package.Person");
获取构造器并实例化:
Constructor<?> constructor = clazz1.getConstructor(String.class);
Person p = (Person) constructor.newInstance("Tom");
获取字段和方法:
Field nameField = clazz1.getDeclaredField("name");
nameField.setAccessible(true); // 解除私有访问限制
nameField.set(p, "Jerry");
System.out.println(nameField.get(p)); // 输出 JerryMethod method = clazz1.getDeclaredMethod("sayHello");
method.setAccessible(true);
method.invoke(p); // 输出 Hello, my name is Jerry

二、注解:元数据的声明机制

2.1 注解的定义与使用

注解是 Java 5 引入的一种元数据机制,常用于代码标记、配置或提供信息给框架。

自定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecution {String value() default "执行方法";
}
使用注解:
public class UserService {@LogExecution("执行用户注册")public void register(String name) {System.out.println(name + " registered.");}
}
解析注解:
public class AnnotationProcessor {public static void main(String[] args) throws Exception {Method method = UserService.class.getMethod("register", String.class);if (method.isAnnotationPresent(LogExecution.class)) {LogExecution log = method.getAnnotation(LogExecution.class);System.out.println("日志: " + log.value());}}
}

输出:日志: 执行用户注册


三、动态代理:运行时生成接口实现

3.1 动态代理的应用场景

Java 的动态代理允许你在运行时生成一个实现了指定接口的类。常用于:

  • AOP 编程(如日志、事务处理)
  • RPC 框架(如 Dubbo)
  • 装饰器模式的实现

3.2 使用 JDK 动态代理

定义接口与实现:
public interface HelloService {void sayHello(String name);
}public class HelloServiceImpl implements HelloService {public void sayHello(String name) {System.out.println("Hello, " + name);}
}
创建代理处理器:
public class LogInvocationHandler implements InvocationHandler {private final Object target;public LogInvocationHandler(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;}
}
创建代理对象并调用:
public class ProxyDemo {public static void main(String[] args) {HelloService service = new HelloServiceImpl();HelloService proxyInstance = (HelloService) Proxy.newProxyInstance(service.getClass().getClassLoader(),service.getClass().getInterfaces(),new LogInvocationHandler(service));proxyInstance.sayHello("Alice");}
}

输出:

方法调用前: sayHello
Hello, Alice
方法调用后: sayHello

四、注解 + 反射 + 代理:模拟 AOP 切面编程

结合三者,我们可以模拟一个 AOP 实现:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {String value() default "调用方法";
}public interface UserService {@Log("用户登录")void login(String username);
}public class UserServiceImpl implements UserService {public void login(String username) {System.out.println(username + " 登录系统");}
}public class AOPHandler implements InvocationHandler {private final Object target;public AOPHandler(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.isAnnotationPresent(Log.class)) {Log log = method.getAnnotation(Log.class);System.out.println("[AOP日志] " + log.value());}return method.invoke(target, args);}
}public class AOPDemo {public static void main(String[] args) {UserService target = new UserServiceImpl();UserService proxy = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new AOPHandler(target));proxy.login("admin");}
}

输出:

[AOP日志] 用户登录
admin 登录系统

五、总结

特性用途常用 API/关键词
反射运行时探查与操作类结构Class、Method、Field、Constructor
注解元数据标注@interface、@Retention、@Target
动态代理运行时增强接口逻辑、AOP 实现Proxy.newProxyInstance、InvocationHandler
http://www.xdnf.cn/news/937405.html

相关文章:

  • 基于Python学习《Head First设计模式》第十章 状态模式
  • JavaScript数组扁平化(Array Flattening)全解析:从基础到进阶的9种实现方式及深度对比
  • C++.OpenGL (17/64)深度测试(Depth Testing)
  • Python Wheel 打包基本原理详解
  • LangChain工具集成实战:构建智能问答系统完整指南
  • RoboDK 自定义机器人
  • 当前市场环境下,软件行业的突围之道:技术演进与商业模式重构
  • 工厂方法模式和抽象工厂方法模式的battle
  • 135. 分发糖果
  • 【P2P】直播网络拓扑及编码模式
  • 【2025年6月8日】Claude 4 国内使用全攻略
  • 【优选算法】模拟 问题算法
  • CompletableFuture+线程池使用案列
  • 直观地理解程序的堆和栈
  • Go 语言中的内置运算符
  • LLMs之Structured Output:vLLM 结构化输出指南—从约束生成到自动解析与高效实现
  • 算法工程师认知水平要求总结
  • (javaEE)网络原理-初识 局域网和广域网 ip地址和端口号 协议 五元组 协议分层 OSI七层模型 网络数据通信的基本流程
  • (二)原型模式
  • AI短视频创富营
  • Go语言系统监控实战:gopsutil库全面解析与应用
  • nginx部署
  • K8S认证|CKS题库+答案| 8. 沙箱运行容器 gVisor
  • 安装Openstack
  • 编程技巧(基于STM32)第二章 全功能按键非阻塞式实现按键单击、双击和长按
  • 【agent开发】VS Code连接WSL失败解决
  • 实验一:数据选择器实验
  • Go语言中的if else控制语句
  • DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
  • masm32汇编实现扫雷进程注入