Java动态代理1
需积分: 0 151 浏览量
更新于2022-08-08
收藏 12KB DOCX 举报
Java动态代理是Java提供的一种在运行时创建代理对象的技术,它允许我们为已经存在的接口创建代理类,从而在不修改原有代码的情况下,增加新的功能或对原有行为进行增强。动态代理在很多场景下都有广泛的应用,如日志记录、事务管理、性能监控等。
一、简单的动态代理实现
1. 实现`InvocationHandler`接口
`InvocationHandler`是Java动态代理的核心,它定义了一个方法`invoke()`,当调用代理对象的方法时,实际上会执行`invoke()`方法。我们需要自定义一个类实现`InvocationHandler`接口,并重写`invoke()`方法。在这个方法里,我们可以处理代理逻辑,比如添加额外的行为或改变原有的行为。
```java
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 {
// 在调用真实对象的方法前添加操作
before();
// 调用真实对象的方法
Object result = method.invoke(target, args);
// 在调用真实对象的方法后添加操作
after();
return result;
}
private void before() {
// 执行前置逻辑,如打印日志
}
private void after() {
// 执行后置逻辑,如记录执行时间
}
}
```
2. `Proxy.newInstance()`创建代理实例
使用`Proxy`类的静态方法`newInstance()`可以创建动态代理对象。这个方法需要传入两个参数:一个是`InvocationHandler`实例,另一个是被代理的接口列表。
```java
Interface targetInterface = ...; // 假设已有的接口实例
MyInvocationHandler handler = new MyInvocationHandler(targetInterface);
Interface proxyInstance = (Interface) Proxy.newProxyInstance(
Interface.class.getClassLoader(),
new Class[]{Interface.class},
handler
);
```
现在,`proxyInstance`就是一个动态代理对象,它实现了`Interface`接口,并且其方法调用会由`MyInvocationHandler`处理。
二、实际案例:兼容遗留系统
假设我们有一个遗留系统,其中有一些旧接口`OldInterface`,而我们希望使用新接口`NewInterface`,但又不想修改旧系统的代码。通过动态代理,我们可以创建一个实现了`NewInterface`的代理类,让它在内部调用`OldInterface`的方法,实现接口间的转换。
```java
public class OldSystemAdapter implements NewInterface, InvocationHandler {
private OldInterface oldInterface;
public OldSystemAdapter(OldInterface oldInterface) {
this.oldInterface = oldInterface;
}
@Override
public void newMethod() {
invoke(this, OldInterface.class.getMethod("oldMethod"), null);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getDeclaringClass().equals(NewInterface.class)) {
// 处理NewInterface中的方法
return method.invoke(this, args);
} else {
// 调用OldInterface中的方法
return method.invoke(oldInterface, args);
}
}
}
// 使用
OldInterface oldImpl = ...; // 旧接口的实现
NewInterface newProxy = (NewInterface) Proxy.newProxyInstance(
OldSystemAdapter.class.getClassLoader(),
new Class[]{NewInterface.class},
new OldSystemAdapter(oldImpl)
);
newProxy.newMethod();
```
在这个例子中,`OldSystemAdapter`实现了`NewInterface`和`InvocationHandler`,它将`NewInterface`的方法映射到`OldInterface`的方法上,实现了新旧接口的兼容。
总结,Java动态代理是一种强大的工具,它允许我们在运行时构建代理对象,灵活地扩展已有代码的功能,同时保持代码的整洁和模块化。通过实现`InvocationHandler`接口并利用`Proxy`类,我们可以创建出符合特定需求的代理对象,满足各种复杂场景的应用。
张盛锋
- 粉丝: 31
- 资源: 297
最新资源
- 09MnNiDR钢制低温压力容器焊接工艺的确定.pdf
- 09MnNiDR钢制球罐用W707DRQ焊条焊接性能 - .pdf
- 09MnNiDR低温压力容器钢板的试验及焊接检验.pdf
- 9Ni钢低温储罐焊接工艺研究.pdf
- 9Cr与CrMoV异种焊接接头疲劳裂纹扩展门槛值研究.pdf
- 10CrMo910耐热钢的焊接工艺.pdf
- 10CrMo910炉管焊接.pdf
- 10Ni3MoVD锻件焊接裂纹敏感性试验研究.pdf
- 10t电动单梁桥式起重机主梁焊接变形的控制 - .pdf
- 10CrNi3MoV钢双面双弧焊接头组织与性能研究 - .pdf
- 10焊接工字形钢轴压构件截面设计的直接算法.pdf
- 10吨级叉车驱动桥体焊接工艺设计 - .pdf
- 10T级后桥焊接工艺分析.pdf
- 10万m 3原油储罐底板现场焊接及变形控制.pdf
- 10万m3大型原油储罐底板焊接质量控制分析.pdf
- 10万m3原油储罐典型焊接质量缺陷分析与处理.pdf