当前位置:首页 > CN2资讯 > 正文内容

代理模式-动态代理

2天前CN2资讯
关键字]:java,design pattern,设计模式,《Java与模式》学习,Proxy Pattern,代理模式,动态代理,Dynamic Proxy
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@) http://www.blogjava.net/wintys/
[正文]:

package pattern.proxy.dynamic;

import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 代理模式:Proxy Pattern
 * Java对代理模式的支持:
 * java.lang.reflect.Proxy、java.lang.reflect.InvocationHandler.
 * @version 2009-6-27
 * @author Winty(wintys@)
 */
public class DynamicProxyTest{
    public static void main(String[] args){
        Subject subject = new RealSubject();
        Subject proxy = (Subject)DynamicProxySubjectFactory.factory(subject);
        proxy.request();
    }
}


/**
 * 抽象主题角色
 */
abstract interface Subject{
    public void request();
}


/**
 * 真实主题角色
 */
class RealSubject implements Subject{
    @Override
    public void request(){
        System.out.println("do request.");
    }
}


class DynamicProxyHandler implements InvocationHandler{
    private Subject realSubject;

    public DynamicProxyHandler(Subject realSubject){
        this.realSubject = realSubject;
    }

    //proxy代表Proxy生成的代理对象实例$Proxy0
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable{
        
        preRequest();
        Object result = method.invoke(realSubject , args);
        postRequest();

        return result;
    }

    private void preRequest(){
        System.out.println("do preRequest");
    }

    private void postRequest(){
        System.out.println("do postRequest");
    }
}

/**
 * 动态代理类工厂 : 由Poxy类动态生成一个代理类(如:$Proxy0)。
 */
class DynamicProxySubjectFactory{
    /**
     * @param subject 被代理的真实对象。Subject必须为接口,
     *  即subject的真实类型是实现了Subject接口的类。
     *  因为JDK的动态代理并不能随心所欲的代理所有的,
     *  Proxy.newProxyInstance()的第二个参数决定只能代理接口。
     *
     * @return 代理类实例
     */
    public static Object factory(Subject subject){
        Class<?> cls = subject.getClass();
        DynamicProxyHandler handler = new DynamicProxyHandler(subject);

        return Proxy.newProxyInstance(cls.getClassLoader(),
                                                        cls.getInterfaces(),
                                                        handler);
    }
}


 运行结果:
do preRequest
do request.
do postRequest

运行时,如果出现类似如下错误,则可能的原因是没有把Subject声明为接口
java.lang.ClassCastException: $Proxy0 cannot be cast to pattern.proxy.dynamic.Subject

[参考资料]:
[1] 《Java与模式》: 电子工业出版社
[2] 代理模式(Proxy pattern) 转载 : http://www.blogjava.net/terry-zj/archive/2006/06/20/53937.html
[3] Java动态代理实现 : http://blog.csdn.net/kongxx/archive/2005/07/04/413021.aspx
[4] Java动态代理 : http:///blog/archives/224.html
[5] java动态代理实现数据库事务拦截器 : http:///blog/archives/60.html
[6] Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP : http:///article/16922.htm
    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/23892.html

    分享给朋友:

    “代理模式-动态代理 ” 的相关文章

    宝塔安装扩展不生效的解决方案与技巧

    在服务器管理的世界中,宝塔面板无疑是一款强大而受欢迎的工具。它让用户以更简单的方式进行服务器管理。通过宝塔,用户可以轻松管理网站、数据库和各种扩展。而PHPExcel等PHP扩展的安装显得尤为重要,因为它们提供了许多强大的功能,助力网站正常运行。 PHP扩展的重要性不言而喻。没有合适的扩展,网站可能...

    BT开心版:简化Linux服务器管理的最佳工具

    BT开心版是一个强大的Linux服务器管理工具,致力于简化网站的搭建、管理和维护过程。对于那些刚接触Linux操作系统的用户来说,BT开心版的出现无疑是一大福音。它的设计理念是让每个用户无论有多少技术背景,都能高效地管理自己的网页,不必深入学习Linux系统的复杂操作。 首先,我发现BT开心版的最大...

    如何获取低价域名:选购指南与注意事项

    在当今数字化时代,网上存在着大量的低价域名和注册选项。低价域名通常是指那些价格较为便宜的域名,相比传统的域名选择,它们为个人和企业提供了更加实惠的选择。注册这些域名的方式多种多样,市场上也有许多能够提供成本效益高的选择,适合各类需求的用户。 在这个竞争激烈的网上环境中,很多人希望能以较低的成本建立自...

    全面解析UDP攻击:类型、影响及有效防御策略

    在当今网络环境中,UDP攻击是一个话题无法忽视的安全隐患。它是一种常见的网络攻击形式,通常会给目标服务器带来严重的资源消耗。为了更好地理解这一现象,我们不妨简单回顾一下UDP协议的特性,以及攻击者是如何利用这一协议实施攻击的。 UDP,即用户数据报协议(User Datagram Protocol)...

    甲骨文云的永久免费服务:开发者的理想选择

    在现代云计算的环境中,甲骨文云(Oracle Cloud)作为一种强有力的云计算服务,凭借其永久免费服务吸引了许多用户。回想我初次接触甲骨文云时,正是被它提供的多种Always Free服务所吸引,比如我可以免费使用2个实例和20GB的存储空间。这让我在学习和开发上有了更加广阔的可能性,不用担心一开...

    搬瓦工VPS:初学者的最佳选择与使用指南

    大家对VPS可能不太熟悉,搬瓦工VPS在整个市场中已经站稳了脚跟。作为加拿大IT7公司旗下的一款主机服务,搬瓦工以其性价比高的OpenVZ VPS起步,而现在主要以KVM架构为主流,逐渐发展成为国内用户的热门选择。这种转型让我觉得很有意思,因为它不仅仅是一种产品的升级,更是一种服务的提升。 搬瓦工提...