1.代理模式:为一个对象提供一个替身或者占位符以控制对这个对象的访问
@Subject接口
package com.flynewton.proxy.test; /** * TODO Comment of Subject * @author flynewton * */ public interface Subject { void operation(String arg); }
@RealSubject类
package com.flynewton.proxy.test; /** * TODO Comment of RealSubject * @author flynewton * */ public class RealSubject implements Subject { /* (non-Javadoc) * @see com.flynewton.proxy.test.Subject#operation(java.lang.String) */ @Override public void operation(String arg) { System.out.println("实际操作, 参数:" + arg); } }
@ProxySubject类
package com.flynewton.proxy.test; /** * TODO Comment of ProxySubject * @author flynewton * */ public class ProxySubject implements Subject { private Subject beProxy; public ProxySubject(Subject beProxy) { this.beProxy = beProxy; } /* (non-Javadoc) * @see com.flynewton.proxy.test.Subject#operation(java.lang.String) */ @Override public void operation(String arg) { System.out.println("代理操作, 参数:" + arg); beProxy.operation(arg); } }
@测试类:
package com.flynewton.proxy.test; /** * TODO Comment of TestProxy * @author flynewton * */ public class TestProxy { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); ProxySubject proxySubject = new ProxySubject(realSubject); System.out.println("===Without Proxy==="); doSomething(realSubject); System.out.println("===With Proxy======"); doSomething(proxySubject); } public static void doSomething(Subject subject){ subject.operation("flynewton"); } }
@测试结果:
===Without Proxy=== 实际操作,参数:flynewton ===With Proxy====== 代理操作,参数:flynewton 实际操作,参数:flynewton
2.Java动态代理
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1).Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。
(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:
Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。
@ProxyHandler类
package com.flynewton.proxy.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * TODO Comment of ProxyHandler * @author flynewton * */ public class ProxyHandler implements InvocationHandler { private Object beProxy; /** * @param beProxy */ public ProxyHandler(Object beProxy) { super(); this.beProxy = beProxy; } /* (non-Javadoc) * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理类: " + proxy.getClass() + "\n被代理方法: " + method + "\n参数: " + args); return method.invoke(beProxy, args); } }
@测试类:
package com.flynewton.proxy.test; import java.lang.reflect.Proxy; /** * TODO Comment of TestDynamicProxy * * @author flynewton */ public class TestDynamicProxy { /** * @param args */ public static void main(String[] args) { RealSubject realSubject = new RealSubject(); Subject proxySubject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[] { Subject.class }, new ProxyHandler(realSubject)); System.out.println("===Without Proxy==="); doSomething(realSubject); System.out.println("===With Proxy======"); doSomething(proxySubject); } public static void doSomething(Subject subject) { subject.operation("flynewton"); } }
测试结果:
===Without Proxy=== 实际操作, 参数:flynewton ===With Proxy====== 代理类: class $Proxy0 被代理方法: public abstract void com.flynewton.proxy.test.Subject.operation(java.lang.String) 参数: [Ljava.lang.Object;@1034bb5 实际操作, 参数:flynewton
本文学习并修改自:http://zhangjunhd.blog.51cto.com/113473/69996