`
caoruntao
  • 浏览: 475925 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

如何使用Proxy模式及Java内建的动态代理机制

    博客分类:
  • java
阅读更多
1.Proxy模式
代理模式支持将某些操作从实际的对象中分离出来,通过它的代理类提供处理。这样便于修改和管理这些特定的操作。
下面示例一个代理模式的实现。


 
<<interface>>Subject.java
package com.zj.proxy;
 
public interface Subject {
    void operation1();
   
    void operation2(String arg);
}
package com.zj.proxy;
 
public interface Subject {
    void operation1();
   
    void operation2(String arg);
}
 
现实类RealSubject.java
package com.zj.proxy;
 
public class RealSubject implements Subject {
 
    public void operation1() {
       System.out.println("Realer do operation1");
    }
 
    public void operation2(String arg) {
       System.out.println("Realer do operation2 with " + arg);
    }
}
代理类ProxySubject.java
package com.zj.proxy;
 
public class ProxySubject implements Subject {
    private Subject proxied;// 被代理对象
 
    public ProxySubject(Subject proxied) {
       this.proxied = proxied;
    }
 
    public void operation1() {
       System.out.println("Proxyer do operation1");
       proxied.operation1();
    }
 
    public void operation2(String arg) {
       System.out.println("Proxyer do operation2 with " + arg);
       proxied.operation2(arg);
    }
}
测试类SimpleProxyDemo.java
package com.zj.proxy.client;
 
import com.zj.proxy.Subject;
import com.zj.proxy.RealSubject;
import com.zj.proxy.ProxySubject;
 
public class SimpleProxyDemo {
    public static void consumer(Subject subject) {
       subject.operation1();
       subject.operation2("ZJ");
    }
 
    public static void main(String[] args) {
       RealSubject real = new RealSubject();
       System.out.println("===Without Proxy===");
       consumer(real);
       System.out.println("===Use Proxy===");
       consumer(new ProxySubject(real));
    }
}
结果:
===Without Proxy===
Realer do operation1
Realer do operation2 with ZJ
===Use Proxy===
Proxyer do operation1
Realer do operation1
Proxyer do operation2 with ZJ
Realer do operation2 with ZJ
2.使用Java的动态代理机制
设计一个类用于实现InvocationHandle接口,InvocationHandler 是代理实例的调用处理程序实现的接口。
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
<<interface>>InvocationHandle.java
package com.zj.proxy;
 
public class ProxySubject implements Subject {
    private Subject proxied;// 被代理对象
 
    public ProxySubject(Subject proxied) {
       this.proxied = proxied;
    }
 
    public void operation1() {
       System.out.println("Proxyer do operation1");
       proxied.operation1();
    }
 
    public void operation2(String arg) {
       System.out.println("Proxyer do operation2 with " + arg);
       proxied.operation2(arg);
    }
}
package java.lang.reflect;
 
public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable;
}
对应invoke参数:
[1]proxy - 在其上调用方法的代理实例;
[2]method - 对应于在代理实例上调用的接口方法的 Method 实例;
[3]args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null
现在设计一个类实现该接口,并提供代理实例。
DynamicProxyHandler.java
package com.zj.proxy.dynamic;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
 
public class DynamicProxyHandler implements InvocationHandler {
    private Object proxied;
 
    public DynamicProxyHandler(Object proxied) {
       this.proxied = proxied;
    }
 
    public Object invoke(Object proxy, Method method, Object[] args)
           throws Throwable {
       System.out.println("**** proxy: ****\n" + proxy.getClass()
              + "\nmethod: " + method + "\nargs: " + args);
       if (args != null)
           for (Object arg : args)
              System.out.println("  " + arg);
       return method.invoke(proxied, args);
    }
}
这里的private Object proxied;即代理实例,也即上文代理模式中介绍的RealSubject对象。
invoke()方法中,我们会打印它的所有参数,并调用当前代理的方法。
测试类DynamicProxyDemo.java
package com.zj.proxy.client;
 
import java.lang.reflect.Proxy;
import com.zj.proxy.Subject;
import com.zj.proxy.RealSubject;
import com.zj.proxy.dynamic.DynamicProxyHandler;
 
public class DynamicProxyDemo {
    public static void consumer(Subject subject) {
       subject.operation1();
       subject.operation2("ZJ");
    }
   
    public static void main(String[] args) {
        RealSubject real = new RealSubject();
       System.out.println("===Without Proxy===");
       consumer(real);
       System.out.println("===Use Proxy===");
       Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class
              .getClassLoader(), new Class[] { Subject.class },
              new DynamicProxyHandler(real));
       consumer(proxy);
    }
}
这里通过Proxy的静态方法newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)生成代理类,并传递与其关联的调用处理程序new DynamicProxyHandler(real)
对于newProxyInstance()的参数:
[1]loader - 定义代理类的类加载器
[2]interfaces - 代理类要实现的接口列表
[3]h - 指派方法调用的调用处理程序
测试结果:
===Without Proxy===
Realer do operation1
Realer do operation2 with ZJ
===Use Proxy===
**** proxy: ****
class $Proxy0
method: public abstract void com.zj.proxy.Subject.operation1()
args: null
Realer do operation1
**** proxy: ****
class $Proxy0
method: public abstract void com.zj.proxy.Subject.operation2(java.lang.String)
args: [Ljava.lang.Object;@de6f34
  ZJ
Realer do operation2 with ZJ
从结果可以发现,通过代理可以得到当前被调用的方法,及其参数。代理过程可以基于此进行逻辑处理,测试程序只是简单的打印这些相关信息。

本文出处:http://zhangjunhd.blog.51cto.com/113473/69996

  • 大小: 6.8 KB
分享到:
评论

相关推荐

    java Proxy 动态代理

    动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有接口的扩展与增强。 在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...

    proxy.rar java三种代理模式源码

    接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在"InterfaceProxy"目录中,你可以看到如何利用`Proxy.newProxyInstance()`方法创建接口的代理对象,并通过实现`InvocationHandler`...

    Java代理模式Java动态代理

    通过上述介绍,我们可以看到Java代理模式及其动态代理机制为开发者提供了强大的功能扩展能力。无论是通过代理模式控制对象的访问,还是利用Java动态代理实现特定时刻的行为增强,都是在不改变现有代码结构的前提下...

    Java设计模式——代理设计模式(静态代理和动态代理)

    Java提供了一个内置的机制来实现动态代理,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 1. **定义接口**:与静态代理相同,我们依然需要一个业务接口`Service`。 2. **实现...

    Java动态代理[动态类Proxy的使用]

    在Java编程中,动态代理是一种强大的机制,它允许我们在运行时创建代理类,这些代理类可以代表或增强原始目标类的行为。动态代理通常用于实现AOP(面向切面编程)或者提供诸如日志、事务管理等跨切面的功能。本文将...

    java动态代理机制分析及拓展

    Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理通常用于实现AOP(面向切面编程)、事件...

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    代理模式java代码 Proxy(5) 2个代理类

    Java提供了动态代理机制,主要是通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的优点是可以在运行时动态创建代理对象,不需要预先编写代理类。下面是一个动态代理的...

    JAVA 反射机制与动态代理ppt

    - **动态代理**:Java中的动态代理机制基于反射,可以创建一个代理类来拦截并处理方法调用,例如用于AOP(面向切面编程)。 - **插件系统**:在运行时加载未知的插件类,实现模块化和扩展性。 - **测试工具**:单元...

    JAVA动态代理机制

    JAVA动态代理机制是Java语言中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理对象,这些代理对象可以在调用实际方法之前或之后执行额外的操作,如日志记录、性能监控、事务管理等。这个特性使得我们...

    代理模式java代码 Proxy(4)

    在Java中,代理模式可以通过多种方式实现,包括静态代理和动态代理。 在提供的文件列表中,我们可以看到以下几个关键类: 1. `ProxyDisplay`:这个名字暗示了它可能是代理模式中的代理类,用于代表或代替某个实际...

    Java实现动态代理

    - 除了Java标准库提供的动态代理,还可以使用第三方库如CGLIB、ASM等,它们可以通过字节码操作来生成非接口类型的代理类,提供了更灵活的代理机制。 以上就是Java动态代理的基本知识及其在实际应用中的体现。希望...

    设计模式之代理模式proxy.zip

    在Java世界中,代理模式有多种实现方式,其中最常见的是JDK动态代理和CGLIB库。JDK动态代理基于接口实现,它要求目标对象必须实现至少一个接口,然后通过Proxy类和InvocationHandler接口来创建并控制代理对象。当...

    Java动态代理机制综合分析及

    Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。这一机制使得开发者无需手动编写代理类代码,只需...

    Java动态代理实现 Proxy InvocationHandler

    总结来说,Java动态代理通过`Proxy`和`InvocationHandler`提供了灵活的代码扩展机制,可以在运行时为对象创建代理,实现在不修改原有代码的基础上添加额外功能。这在处理需要拦截和增强的对象时非常有用,例如日志...

    Java动态代理机制分析

    Java 动态代理机制是Java反射机制的一部分,它允许开发者在运行时动态创建代理类和对象,以便在方法调用时插入自定义的行为。这种机制主要用于实现AOP(面向切面编程)和拦截器模式,提供了对方法调用的额外控制和...

    Java中的动态代理

    #### 二、Java动态代理机制 Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类提供了一个静态方法`newProxyInstance()`用于创建动态代理对象,而`...

    java动态代理 经典文章(word 2007格式的)

    在Java动态代理机制中,`InvocationHandler`接口扮演着关键角色。它定义了一个`invoke()`方法,当代理对象的方法被调用时,实际上是调用了`InvocationHandler`的`invoke()`方法。这个方法接收三个参数:代理对象、...

    Java反射机制与动态代理

    总结来说,Java反射机制和动态代理是Java编程中不可或缺的部分,它们极大地扩展了Java的灵活性和可扩展性,使得程序员可以在运行时对程序进行更深层次的控制。了解和熟练掌握这两项技术,对于提高Java开发能力和解决...

    Java设计模式-代理模式例子

    2. 动态代理:JDK提供了一种动态代理机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理在运行时生成代理类,可以更加灵活地处理代理关系,减少了代码维护的工作量...

Global site tag (gtag.js) - Google Analytics