Java代理模式 静态代理 动态代理
2014-12-04 16:55
344 查看
静态代理
比如说有一个添加的方法需要记录日志,但又不想修改添加的方法,我们可以采用静态代理,这样的好处是业务类只要关注自己的业务逻辑,保证了重用性,其他的业务如记录日志,权限检查等交给其他的业务类去做
定义接口
被代理的类 要实现User接口
代理类 UserProxy 要和被代理的类UserImp实现同一个User接口
测试类
控制台输出
静态代理要为每个类创建代理类,如果类很多,我们需要创建很多代理类,而且每个方法(add(),delete())都要手动添加日志功能,比较麻烦,所以可以使用动态代理针对某个功能(如日志,权限等)提供一个代理类。
动态代理
继续使用上面的User接口和UserImp类,新加动态代理的类LogProxy,动态代理的类要实现InvocationHandler接口
测试类
控制台输出
比如说有一个添加的方法需要记录日志,但又不想修改添加的方法,我们可以采用静态代理,这样的好处是业务类只要关注自己的业务逻辑,保证了重用性,其他的业务如记录日志,权限检查等交给其他的业务类去做
定义接口
public interface User { public void add(); public void delete(); }
被代理的类 要实现User接口
public class UserImp implements User { @Override public void add() { System.out.println("添加用户..."); } @Override public void delete() { System.out.println("删除用户..."); } }
代理类 UserProxy 要和被代理的类UserImp实现同一个User接口
public class UserProxy implements User { private UserImp userImp; public UserProxy(UserImp userImp) { this.userImp = userImp; } @Override public void add() { System.out.println("开始记录日志"); userImp.add(); System.out.println("记录日志结束"); } @Override public void delete() { System.out.println("开始记录日志"); userImp.delete(); System.out.println("记录日志结束"); } }
测试类
public class Test { public static void main(String[] args) { UserProxy proxy = new UserProxy(new UserImp()); proxy.add(); System.out.println("---------------"); proxy.delete(); } }
控制台输出
开始记录日志 添加用户... 记录日志结束 --------------- 开始记录日志 删除用户... 记录日志结束
静态代理要为每个类创建代理类,如果类很多,我们需要创建很多代理类,而且每个方法(add(),delete())都要手动添加日志功能,比较麻烦,所以可以使用动态代理针对某个功能(如日志,权限等)提供一个代理类。
动态代理
继续使用上面的User接口和UserImp类,新加动态代理的类LogProxy,动态代理的类要实现InvocationHandler接口
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class LogProxy implements InvocationHandler { // 目标对象 private Object obj; public Object bind(Object obj) { this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), // obj.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object object = null; System.out.println("开始记录日志"); object = method.invoke(obj, args); System.out.println("记录日志结束"); return object; } }
测试类
public class Test { public static void main(String[] args) { LogProxy proxy = new LogProxy(); User user = (User) proxy.bind(new UserImp()); user.add(); System.out.println("---------------"); user.delete(); } }
控制台输出
开始记录日志 添加用户... 记录日志结束 --------------- 开始记录日志 删除用户... 记录日志结束
相关文章推荐
- Java代理模式及应用(二)静态代理与动态代理
- java代理模式--静态代理和动态代理
- Java:静态代理和动态代理
- Java静态代理和动态代理
- java 静态代理与动态代理
- Spring的静态代理和动态代理
- 【Java】代处理?代理模式 - 静态代理,动态代理
- java静态代理和动态代理
- java静态代理和动态代理
- Java知识点<11> 静态代理和动态代理
- 前置增强 ,后置增强,异常增强,环绕增强 静态代理,动态代理
- Java静态代理、动态代理
- 从静态代理到动态代理
- 静态代理和动态代理
- Java静态代理和动态代理
- 代理-静态代理和动态代理
- 代理-静态代理和动态代理
- Java静态代理和动态代理
- java静态代理和动态代理
- java静态代理,动态代理