MyException - 我的异常网
当前位置:我的异常网» 软件架构设计 » 署理模式之JDK动态代理

署理模式之JDK动态代理

www.MyException.Cn  网友分享于:2015-08-23  浏览:0次
代理模式之JDK动态代理

学习spring过程中学习了它的核心思想AOP,也就是面向切面编程,而AOP的就是通过动态代理实现,动态代理有基于JDK模式的实现以及cglib继承的实现。
1:什么是代理?作用?
代理为其他对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。它显得更专业,相对于原来的实现类来说的话。
2:实例:
我们模拟一个场景,在一个类中要加入权限认证的功能,如果是传统的做法,可以在业务源代码中添加代码,但这样对系统有侵入性,不好。通过动态代理就可以很好解决了。
3:代理模式涉及的专业名词:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻 辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
4:代理模式的优点
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
(3).高扩展性
5:实例测试
a:先定义一个产品的接口:

package com.yc.biz;
public interface ProductBiz {
    public void addProduct();
}

实现类:
package com.yc.biz.impl;

import com.yc.biz.ProductBiz;
//真实主题
public class ProductBizImpl implements ProductBiz{
    @Override
    public void addProduct() {
        System.out.println("********************");
        System.out.println("添加产品");
        System.out.println("********************");
    }
}

jdk动态代理的实现:

package com.yc.advice;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//这个类是一个切面类,完成的是向目标类的目标方法加入功能(增强)
public class RightAdvice implements InvocationHandler{
    //代理模式最核心:代理模式中一定要有目标类的引用
    private Object targetObject; //注意:这个就是目标类的引用
/*  public RightAdvice( Object targetObject){
        this.targetObject=targetObject;
    }*/
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        String methodName=method.getName();
        if(methodName.startsWith("add")||methodName.startsWith("del")||methodName.startsWith("aupdate")){
            //在invoke中加入您要增强的代码
            check();
        }
        //调用目标类的对应的发放那个方法
        Object returnvalue=method.invoke(targetObject, args);
        return returnvalue;
    }
    //创建一个方法来完成创建代理对象
    //代理模式最核心:代理模式中一定要有目标类的引用
    public Object createInstance(Object targetObject){
        this.targetObject=targetObject;
        //生成一个代理对象
        //生成一个代理对象,这个代理对象是根据目标类的接口生成的
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
        //在客户端,我们调用ceateInstance()得到一个代理对象,在调用这个代理对象的方法,-->它就会自动的回调(因为this)--》invoke
    }
    public void check(){
        System.out.println("$$$$$$$$$$$$$$$$$$$");
		System.out.println("权限检查");
		System.out.println("$$$$$$$$$$$$$$$$$$$");
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

1楼u013883025昨天 21:36
写的不错

文章评论

10个调试和排错的小建议
10个调试和排错的小建议
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
 程序员的样子
程序员的样子
如何成为一名黑客
如何成为一名黑客
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Java程序员必看电影
Java程序员必看电影
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
每天工作4小时的程序员
每天工作4小时的程序员
一个程序员的时间管理
一个程序员的时间管理
编程语言是女人
编程语言是女人
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我的丈夫是个程序员
我的丈夫是个程序员
中美印日四国程序员比较
中美印日四国程序员比较
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员应该关注的一些事儿
程序员应该关注的一些事儿
那些争议最大的编程观点
那些争议最大的编程观点
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
为什么程序员都是夜猫子
为什么程序员都是夜猫子
旅行,写作,编程
旅行,写作,编程
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员必看的十大电影
程序员必看的十大电影
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员都该阅读的书
程序员都该阅读的书
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员的鄙视链
程序员的鄙视链
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
漫画:程序员的工作
漫画:程序员的工作
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
我是如何打败拖延症的
我是如何打败拖延症的
老程序员的下场
老程序员的下场
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员和编码员之间的区别
程序员和编码员之间的区别
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
鲜为人知的编程真相
鲜为人知的编程真相
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有