Java动态代理1

preview
需积分: 0 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`类,我们可以创建出符合特定需求的代理对象,满足各种复杂场景的应用。