代理模式之动态代理
来源:互联网 发布:七层网络协议 编辑:程序博客网 时间:2024/06/15 06:12
乐享云之天 2017-01-02 09:55
动态代理:
根据目标对象,在程序运行期自动装配目标对象的代理对象.
优点:可以根据不同的对象,动态装配出对应的代理对象
缺点:采用了反射,导致运行速度会有延迟,JDK的动态代理必须是实现了接口的类(如果不实现接口,可以使用CGLIB)
接口类:UserManager.java
package com.djpowernode.spring;public interface UserManager { public void addUser(String username, String password);}
实现类:UserManagerImpl.java
package com.djpowernode.spring;public class UserManagerImpl implements UserManager { @Override public void addUser(String username, String password) { System.out.println("--------UserManagerImpl.addUser-----------------"); }}
动态代理类:UserManagerImplProxy.java
package com.djpowernode.spring;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class UserManagerImplProxy implements InvocationHandler { private Object targetObject; public Object createObjectProxy(Object targetObject){ this.targetObject = targetObject; //targetObject.getClass.getClassLoader取得目标对象的类加载环境 //targetObject.getClass.getInterfaces取得目标对象的实现的所有接口 //this,代理对象,就是该代理类本身,需要加入新的功能checkScurity //Proxy.newProxyInstance根据取得的信息,自动装配出代理对象并返回(在程序运行期自动装配) return Proxy.newProxyInstance(targetObject.getClass.getClassLoader, targetObject.getClass.getInterfaces, this); } //重新InvocationHandler中的invoke方法,会在生成代理对象的时候,自动执行该方法 //根据调用的方法的不同,自动对该方法进行一次封装,执行对应的方法就是在执行invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object rect = null; //根据规则,只对add开始的方法代理,类型与Spring中代理实现(Pointcut,Advice) if(method.getName.startsWith("add123")){ checkScurity; //method.invoke取得对象执行的某个方法并执行该方法 rect = method.invoke(targetObject, args); } return rect; } //在代理类中根据需求需要添加的功能 private void checkScurity{ System.out.println("-----------checkScurity--------------"); }}
测试类:Client.java
package com.djpowernode.spring;public class Client { /** * @param args */ public static void main(String[] args) {// UserManager userManager = new UserManagerImpl; UserManagerImplProxy proxy = new UserManagerImplProxy; UserManager userManager = (UserManager) proxy.createObjectProxy(new UserManagerImpl); userManager.addUser("张三", "123456"); }}
本文为头条号作者发布,不代表今日头条立场。
0 0
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 动态代理模式之JDk动态代理
- 结构模式之代理模式 动态代理
- 设计模式之代理模式-------动态代理
- 【JAVA】代理模式之Java动态代理
- 代理模式之动态代理实践
- 设计模式之静态代理&动态代理
- 代理模式之Java动态代理
- 代理模式之JDK动态代理
- Android studio默认安装路径?
- 浅谈Oracle中存储过程的基本结构-参数!
- Linux系统 Oracle 10gR2(10.2.0.5)RAC安装
- 基于Spring的WebService
- [iOS开发系列--让你的应用“动”起来] CALayer 详解 {转}
- 代理模式之动态代理
- 2017.01.03回顾 less命令 python类 super机制
- day10 eclipse jar文件 doc输出 String类 StringBuffer以及StringBuilder
- 安卓中动态设置控件的宽度和高度
- jquery 中ajax调用
- Android EditText实现可横向滑动TextView效果
- 学习Struts2的记录
- Spring基础知识汇总
- LeetCode 396. Rotate Function