Java动态代理
Java动态代理
动态代理是Java中一种强大的机制,允许在运行时创建代理对象,用于在方法调用前后插入自定义逻辑,而无需修改原始类代码。
核心概念
动态代理的组成
- Proxy类:java.lang.reflect.Proxy,用于创建动态代理实例
- InvocationHandler接口:定义代理实例的方法调用如何被处理
- 被代理的接口:代理对象将实现的接口
基本实现步骤
- 定义一个实现InvocationHandler接口的类
- 使用Proxy.newProxyInstance()方法创建代理对象
- 通过代理对象调用方法
代码示例
// 1. 定义接口
package org.example;
interface UserService {
void save();
String find(String name);
}
// 2. 实现类
package org.example;
class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("保存用户数据");
}
@Override
public String find(String name) {
return "查找用户: " + name;
}
}
// 3. 实现InvocationHandler
package org.example;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
private Object target; // 被代理的对象
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
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("方法调用后");
return result;
}
}
package org.example;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class DynamicProxyDemo {
public static void main(String[] args) {
// 创建被代理对象
UserService userService = new UserServiceImpl();
// 创建InvocationHandler
InvocationHandler handler = new MyInvocationHandler(userService);
// 创建代理对象
UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), handler);
// 通过代理对象调用方法
proxy.save();
System.out.println(proxy.find("李四"));
}
}
输出结果
方法调用前: save
保存用户数据
方法调用后
方法调用前: find
方法调用后
查找用户: 李四
动态代理的特点
- 运行时创建:代理类是在运行时动态生成的
- 基于接口:只能代理接口,不能代理类
- AOP实现基础:Spring AOP等框架的基础实现方式
- 性能考虑:由于使用反射,性能比直接调用稍低
动态代理的应用场景
- 日志记录
- 事务管理
- 权限控制
- 性能监控
- 远程方法调用(RPC)
注意事项
- 动态代理只能代理接口,不能代理类
- 若需要代理类,可以考虑使用CGLIB等字节码增强库
- 过度使用动态代理可能会影响性能
- 调试代理代码可能比较困难
小结
动态代理是Java反射机制的重要应用,也是许多框架(如Spring)实现AOP功能的基础技术。
相关文章
- Java官方宣布:32位系统用户,你们被抛弃了!
- Java二十周年特别策划--谈谈我与Java的那些年、这些事
- Java二十周年特别策划——谈谈我与Java的那些年、这些事
- Java 25 在 JEP 519 中集成了紧凑对象头
- Java动态代理
- JAVA入门教程-第1章 概述
- 那些让你望而却步的Java概念,其实没那么难!
- CBN x ASEAN Watch丨Labubu-mania: The unlikely cultural sensation sweeping Southeast Asia
- CBN Correspondent丨Coffee shirt, methanol bus, 100% green power…Boao goes all-in on zero-carbon push
- CBN丨Policy supports to shore up foreign investors' confidence