`

代理模式Dynamic Proxies(四、Struts2.0拦截器Interceptor)

 
阅读更多

一、概念和注意点:
    Once you write a dynamic proxy class, you can use it to wrap any object, so

long as the object is an instance of a class that implements an interface that

declares the behavior you want to intercept.
    动态代理可以用来包裹任何类,拦截这个类实现的接口中的某些方法,在执行这些方法

的前后加入适当动作。
    Dynamic proxies in Java let you wrap an object with a proxy that intercepts

the object's calls and that can add behavior before or after passing the call

along.This lets you create reusable behavior that you can drop in on an arbitrary

object, in a fashion similar to aspect-oriented programming.
    在被拦截的方法前后加入适当操作——提高了“可重用性”,类似AOP的做法。
    In AOP, an aspect is a combination of aspect——code that you want to drop in

——and point cuts——definitions of execution points in your code where you want

the drop-in code to run.
    理解AOP中的两个概念:
    1)aspect——可重用代码
    2)point cuts——执行点

 

Sam的总结: Dynamic Proxies就是一个拦截器,在某些操作的前后加上可重用代码。记住

Java中实现动态代理需要实现的接口和方法。

 

二、代码

 

动态代理的使用ShowDynamicProxy.java

      原来的对象HashSet s 被代理后,可以转化为HashSet的(任意)父接口Set,在执行Set中声明的任意方法时,会在外围包裹拦截动作^_^

package app.proxy.dynamic;

import java.util.HashSet;
import java.util.Set;

import com.oozinoz.firework.Firecracker;
import com.oozinoz.firework.Sparkler;
import com.oozinoz.utility.Dollars;

/**
 * Show an example of using a dynamic proxy to add behavior to an object. In
 * this example, we add an element of impatience, complaining if any method
 * takes too long to execute.
 */
public class ShowDynamicProxy {
    public static void main(String[] args) {
        Set s = new HashSet();
        s = (Set) ImpatientProxy.newInstance(s); /* 代理后可以强制转化为原来类实现的任何接口类型 */
        s.add(new Sparkler("Mr. Twinkle", new Dollars(0.05)));
        s.add(new BadApple("Lemon"));
        s.add(new Firecracker("Mr. Boomy", new Dollars(0.25)));

        System.out.println("The set contains " + s.size() + " things.");
    }
}

 

动态代理类ImpatientProxy.java

      1)动态代理类必须实现InvocationHandler接口,以及该接口中的invoke(...)方法;

      2)背下来:静态实例化方法newInstance(...)的实现。

package app.proxy.dynamic;

import java.lang.reflect.*;

/**
 * This class is an example of a dynamic proxy. Instances of this class wrap a
 * proxied object. This class simply forwards calls to the object it wraps.
 * However, if any method takes a long time to execute, this class will print a
 * warning message.
 */
public class ImpatientProxy implements InvocationHandler {

    private Object obj;

    /**
     * Construct a dynamic proxy around the given object.
     * @param obj the object to wrap
     * @return the proxy
     */
    public static Object newInstance(Object obj) {
        ClassLoader loader = obj.getClass().getClassLoader();	/* 获取“被代理类”的加载器 */
        Class[] classes = obj.getClass().getInterfaces();		/* 获取“被代理类”实现的接口 */
        return Proxy.newProxyInstance(loader, classes, new ImpatientProxy(obj));	/* 返回Object类型的代理 */
        /*
         * 注意:The returned object will implement all the interfaces that the wrapped
         * object's class implements. We can cast the returned object to any of these 
         * interfaces.
         */
    }

    private ImpatientProxy(Object obj) {
        this.obj = obj;
    }

    /**
     * The method that all dynamic proxies must implement. This dynamic proxy
     * complains when a method takes a long time to return.
     */
    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
        Object result;
        long t1 = System.currentTimeMillis();
        result = m.invoke(obj, args);
        long t2 = System.currentTimeMillis();
        if (t2 - t1 > 10) {
            System.out.println("> It takes " + (t2 - t1) + " millis to invoke " + m.getName()
                    + "() with");
            for (int i = 0; i < args.length; i++) 
                System.out.println(">     arg[" + i + "]: " + args[i]);
        }
        return result;
    }
}

 

分享到:
评论

相关推荐

    代理模式Image Proxies(一、最朴素实现)

    代理模式在软件设计模式中是一种常用的技术,它允许我们在访问或操作某个对象时,通过一个中介对象(代理)来进行,从而增加了灵活性和控制性。在本文中,我们将探讨代理模式的最朴素实现,并通过Java代码示例进行...

    代理模式Image Proxies(二、最朴素实现)

    在这个名为“代理模式Image Proxies”的主题中,我们将探讨如何通过最朴素的方式来实现图像加载的代理。这个话题主要涉及到两个Java类:`LoadingImageIcon.java`和`ShowLoader.java`。 `LoadingImageIcon.java`可能...

    代理模式Remote Proxies(三、RMI)

    代理模式在软件设计中是一种常用的设计模式,它允许我们为一个对象提供一个替代品或占位符,以便控制对真实对象的访问。在远程方法调用(Remote Method Invocation,RMI)场景下,代理模式的应用尤为突出。RMI是Java...

    proxies_chi.zip

    标题"proxies_chi.zip"和描述中提到的内容是关于创建一个代理IP池的Python项目,这个项目能够自动从网络上抓取IP地址,检查它们的可用性,并将这些信息存储到数据库中,以便后续使用。这涉及到网络爬虫、IP验证、...

    Laravel开发-laravel-valid-proxies

    在Laravel框架中,"laravel-valid-proxies"通常指的...在实际开发中,正确配置和使用`laravel-valid-proxies`可以帮助开发者解决因代理而产生的各种问题,如防止恶意请求,以及在多层代理环境中正确识别客户端IP地址。

    c#动态代理

    在.NET Framework中,C#动态代理是一种强大的设计模式,它允许我们在运行时创建对象的代理,从而可以在调用实际目标对象的方法之前或之后插入额外的行为。动态代理的主要用途包括:AOP(面向切面编程)、远程方法...

    koa-proxies:koa@2.x代理中间件

    Koa代理 middlware HTTP代理 由提供支持。 安装 $ npm install koa-proxies --save 选件 http-proxy活动 options . events = { error ( err , req , res ) { } , proxyReq ( proxyReq , req , res ) { } , ...

    python中requests使用代理proxies方法介绍

    学习网络爬虫难免遇到使用代理的情况,下面介绍一下如何使用requests设置代理: 如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求: import requests proxies = { ...

    Smart Proxies and Interceptors in RMI-开源

    在Java的远程方法调用(Remote Method Invocation, RMI)技术中,智能代理(Smart Proxies)和拦截器(Interceptors)是两个重要的概念,它们为分布式系统提供了增强的功能和控制。本文将深入探讨这两个概念及其在...

    python3爬取快代理免费代理ip并多线程验证

    - 打开文件:`with open('proxies.txt', 'w') as f`,'w'表示写入模式。 - 写入数据:`f.write(ip + '\n')`,每行写入一个IP。 综上所述,这个项目涵盖了Python的网络请求、HTML解析、代理设置、多线程和数据存储...

    Cglib的jar文件 Cglib.zip

    Cglib是Eclipse的Dynamic Proxies的一个补充,它在某些情况下提供了更高的性能。 Cglib的核心是基于ASM库,ASM是一个字节码操作和分析框架,可以直接生成和修改Java类和属性。ASM-commons和ASM-tree分别是ASM的辅助...

    JSP和Struts应用系统用户退出的完美解决方案

    在Java Web开发中,JSP(JavaServer Pages)和Struts是两个常用的技术,用于构建动态、交互式的Web应用程序。Struts作为一个MVC(Model-View-Controller)框架,为开发者提供了一种组织和管理应用逻辑的方式,而JSP...

    Laravel开发-laravel-valid-proxies .zip.zip

    在本文中,我们将深入探讨Laravel框架中的代理验证(laravel-valid-proxies)这一主题。Laravel是一个流行的PHP框架,它提供了丰富的功能和工具,帮助开发者构建高效、优雅的Web应用。`laravel-valid-proxies`是...

    Python库 | proxies_l-0.0.3.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:proxies_l-0.0.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Java Networking and Proxies Code

    在Java编程领域,网络通信和代理(Proxies)是重要的组成部分,特别是在开发需要跨网络进行数据交换的应用时。本文将详细解析"Java Networking and Proxies Code"这一主题,包括如何启动一个线程来检查URL是否通过...

    scrapy-rotating-proxies:与Scrapy一起使用多个代理

    刮擦旋转代理 该软件包提供了一个中间件来使用旋转代理,检查它们是否还活着并调整爬网速度。 许可证是麻省理工学院。安装pip install scrapy-rotating-proxies用法将带有代理列表的ROTATING_PROXY_LIST选项添加到...

    PyPI 官网下载 | scrapy-scylla-proxies-0.1.4.1.tar.gz

    Scrapy-Scylla-Proxies 是一个 Python 库,专门用于Scrapy爬虫框架,它提供了高效且稳定的代理服务器管理功能。这个库的版本是0.1.4.1,可以在Python的包索引(PyPI)官网上找到并下载。在Python的开发中,PyPI是一...

    用Proxies实现对象撤消使重做和更改历史记录

    为实现这一功能,开发者常常利用设计模式来辅助,其中一种常用的方法是使用"代理"(Proxies)。本文将详细探讨如何通过JavaScript的Proxy对象来实现对象撤消/重做以及记录更改历史。 首先,让我们理解什么是Proxy。...

    Delphi_Proxy_Scraper.zip_Proxies

    标题中的"Delphi_Proxy_Scraper.zip_Proxies"暗示了这是一个使用Delphi编程语言编写的代理服务器抓取程序。Delphi是一种基于Object Pascal的集成开发环境(IDE),常用于创建桌面应用程序。在这个项目中,开发者可能...

Global site tag (gtag.js) - Google Analytics