动态代理

来源:互联网 发布:写蒙古语软件下载 编辑:程序博客网 时间:2024/06/05 06:08


       到底“动态代理”动态在哪里?是不是指在运行时才将它实例化并和handler联系起来?

       不是的,动态代理之所以被称为动态,是因为运行时才能将它的类创造出来,代码开始执行时,还没有proxy类。它是根据需要从你传入的接口集创建的。


       动态代理:本该是自己做的事情,请了别人来做,被请的人就是代理对象。

(一):

       现在,我们有一个简单的需求:对User进行增删改查操作。我们常常说面向接口编程,首先呢,我们需要声明一个UserManager接口类。

package JDKProxy;public interface UserManager {public void addUser();public void delUser();public String findUserById();public void modifyUser();}
       然后我们定义一个实现UserManager接口的类UserManagerImpl。

package JDKProxy;public class UserManagerImpl implements UserManager {@Overridepublic void addUser() {System.out.println("添加功能");}@Overridepublic void delUser() {System.out.println("删除功能");}

      现在我们需要对上述方法进行测试。

package JDKProxy;import java.lang.reflect.Proxy;public class Client {/** * @param args */ public static void main(String args[]) {  UserManager user=new UserManagerImpl(); user.addUser(); user.delUser(); System.out.println("--------------------");    } }

测试结果如下:



       后来呢,我们的需求变了,对User进行增删改查操作之前先进行校验,之后添加日志操作记录。传统的方法是直接修改UserManagerImpl类的四个方法。简单示例如下:


但这样是不符合开闭原则的。

(二)

       JDK动态代理需要java.lang.reflect包中的InvocationHandler、Method、Proxy,声明一个实现InvocationHandler接口的类SecurityHandler。

package JDKProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class SecurityHandler implements InvocationHandler {//定义调用的目标类对象 private Object targetObject;  //创建一个代理实例  public  SecurityHandler(Object targetObject) { this.targetObject=targetObject; }//代理类的执行过程@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {checkSecurity();//调用目标方法,代理模式思想的体现Object obj=method.invoke(targetObject, args);operationLog();return obj;}//权限校验功能private void checkSecurity(){System.out.println("权限校验功能");} //记录操作日志private void operationLog(){System.out.println("操作日志功能");}}

        在Client类的main方法中添加如下代码:

 //希望在添加和删除之前做一个校验,之后写操作日志   SecurityHandler s=new SecurityHandler(user);   //动态代理是面向接口的代理     UserManager u=(UserManager) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), s);  
//这个U就是代理后的对象了 (user是被代理的对象)   u.addUser();   u.delUser();

     运行main后的结果如下所示:





  


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 看完的小说想要卖掉该怎么办 在俄罗斯脸干了痛怎么办 苹果手表电池放亏了怎么办 平板电脑电池不耐用怎么办 计算机电池放入后没反应怎么办 笔记本电脑玩游戏花屏怎么办 笔记本玩游戏花屏怎么办 笔记本电脑充电插口坏了怎么办 车蓄电池没电了怎么办 汤浅q85电瓶亏电怎么办 富士康自离行李怎么办 微店红酒食品认证怎么办 yy频道提示禁止游客进入怎么办 口红颜色太艳了怎么办 我在菲律宾想走怎么办 当国家流通货币不够用怎么办 苹果5s账号密码忘记怎么办 钢铁雄心3补给不足怎么办 灯外观颜色太难看了怎么办 被移民公司骗了怎么办 文明5大包锁区怎么办 鸭子被黄鼠狼叼走了怎么办 黄鼠狼再店了拉屎怎么办 我只有信用卡但是又想去嫖怎么办 瑞士退税单掉了怎么办 装了新风噪音大怎么办 意大利 护照被偷了怎么办 请问去意大利要怎么办护照 在意大利护照丢了怎么办 考研二战档案打回原籍怎么办 脸上的肉往下掉怎么办 眼镜带了往下掉怎么办 孩子捅别的孩子眼睛了怎么办 眼睛不小心捅伤怎么办 我的爸爸是小偷怎么办 违停罚款忘记交怎么办 顺风车无人接单怎么办 来例假腰特别疼怎么办 把人撞死了全责怎么办 朝鲜与美合作对付中国怎么办 申请美国大学gpa不够怎么办