作用:为其它对象提供一种代理,以控制外界对该对象的访问
静态代理
代码:
/** * 代理对象(Proxy) 和 被代理对象(Target) 的共同接口 * @author lyn * "出租" 的行为 */ public interface ICanLease { public void lease(); } /** * 房子的主人 (具有把房子出租出去的行为) * @authorlyn */ public class Landlord implements ICanLease{ @Override public void lease() { System.out.println("房子的主人把房子出租出去..."); } } /** * 万恶的房产中介 (同样具有把房子出租出去的行为) * @author lyn * */ public class LandlordProxy implements ICanLease{ private ICanLease target; //被代理的对象(即真正房子的主人) public LandlordProxy(ICanLease target){ this.target = target; } @Override publicvoid lease() { System.out.println("租出之前,黑心中介坑你一点"); target.lease(); //把被代理对象的房子出租 System.out.println("租出之后,黑心中介坑你一点"); } } /** * 悲摧的外来打工者 * @author lyn */ publi cclass Client { public static void main(String[] args) { LandlordProxy proxy = new LandlordProxy(new Landlord()); proxy.lease(); } }
动态代理
//ProxyInvocationHandler.java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 代理对象把代理要做事交给本类对象去处理 */ public class ProxyInvocationHandler implements InvocationHandler { private Object target; //要为其生成代理的对象 public void setTarget(Object target) { this.target = target; } public ProxyInvocationHandler(){ } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("真正做事之前做点坏事...."); Object ret = method.invoke(target, args); System.out.println("做事之后再做点坏事...."); return ret; } public ProxyInvocationHandler(Object target){ this.target = target; } } //Clent.java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * 使用 */ public class Clent { public static void main(String[] args) { InvocationHandler handler = new ProxyInvocationHandler(new String("123")); //动态生成一个代理对象(所属的类可能为$Proxy0,是JVM运行时动态生成的) CharSequence proxy = (CharSequence) Proxy.newProxyInstance(String.class.getClassLoader(), String.class.getInterfaces(), handler); proxy.toString(); } }