切换主题
Java 动态代理
Java 动态代理是一种在运行时动态生成代理类的机制,主要用于拦截方法调用、增强功能或实现 AOP(面向切面编程)。
动态代理的特点
- 运行时生成代理类:无需手动编写代理类,减少代码冗余。
- 接口代理:基于接口的代理,使用
java.lang.reflect.Proxy
实现。 - 灵活性:可以在方法调用前后添加自定义逻辑。
使用场景
- 日志记录:在方法调用前后记录日志。
- 权限校验:在方法调用前检查用户权限。
- 事务管理:在方法调用前后管理事务。
- 远程方法调用:通过代理实现远程服务调用。
示例代码
以下是一个使用动态代理的示例:
java
// filepath: d:\Docs\huaqiwill-dev-docs\编程语言\Java\语言特性\Java动态代理.md
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 定义接口
interface Service {
void performTask();
}
// 接口实现类
class ServiceImpl implements Service {
@Override
public void performTask() {
System.out.println("Executing task...");
}
}
// 动态代理处理器
class DynamicProxyHandler implements InvocationHandler {
private final Object target;
public DynamicProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method: " + method.getName());
return result;
}
}
public class DynamicProxyExample {
public static void main(String[] args) {
// 创建目标对象
Service target = new ServiceImpl();
// 创建代理对象
Service proxy = (Service) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new DynamicProxyHandler(target)
);
// 调用代理方法
proxy.performTask();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
输出结果
Before method: performTask
Executing task...
After method: performTask
1
2
3
2
3
注意事项
- 接口限制:JDK 动态代理只能代理实现了接口的类。如果需要代理没有接口的类,可以使用第三方库(如 CGLIB)。
- 性能开销:动态代理在运行时生成代理类,可能会带来一定的性能开销。
- 安全性:确保代理逻辑中不会泄露敏感信息。