静态代理我们都是手动添加代理主题角色来实现代理,这里我们通过JDK1.5+中提供的 java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态生成代理角色。 使其更灵活。
针对实现任何实现了接口Rent的真实主题角色类,可以动态生成代理主题角色类。
之前的程序我们改写如下:
Rent接口不变,代码:
package com.longewri.proxy.demo01;
/*抽象主题角色 使用接口来进行
*也可以使用抽象类*/
public interface Rent {
//租赁方法
public void rent();
}
Landlord实现类不变,代码:
package com.longewri.proxy.demo01;
/*
* Landlord 房东,真实主题角色 实现租赁接口Rent
* */
public class Landlord implements Rent{
public Landlord(){}
public void rent() {
System.out.println("房东将房屋出租,交易成功!");
}
}
实现接口InvocationHandler的代理处理类InvokHandler:
package com.longewri.proxy.demo01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class InvokHandler implements InvocationHandler {
// 此属性用来保存真实主题角色的引用
private Object realObject;
public void setRealObject(Object object) {
this.realObject = object;
}
public InvokHandler(Object obj) {
setRealObject(obj);
}
// 交付房屋押金
public boolean giveDeposit() {
System.out.println("中介代缴房屋租金和押金.");
return true;
}
// 拿到房屋钥匙
public void getKey() {
System.out.println("中介给你房屋钥匙和租房合同.");
}
// 实现该接口中的这个方法
public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
//设定返回值,方法定义中设置为Object类型,实际的返回类型我们可以根据实际调用的方法的返回类型来进行向下转型
Object result = null;
/*
* 执行真实主题中的方法,此处使用反射
* method表示的是所调用方法的Method对象,此处是rent方法的Method对象
* @object参数表示是由谁来调用这个方法 ,也就是真实主题角色 object args 表示调用的这个方法的参数类型
*
*/
if (giveDeposit()) {
result=method.invoke(realObject, args);
getKey();
}
return result;
}
}
静态工厂方法ProxyFactory,通过传递的真实主题角色 生成代理主题角色:
package com.longewri.proxy.demo01;
import java.lang.reflect.Proxy;
//静态工厂方法 返回代理类对象
public class ProxyFactory {
public static Object getProxy(Object realObject){
InvokHandler ih=new InvokHandler(realObject);
Object resultObject=Proxy.newProxyInstance(realObject.getClass().getClassLoader(),realObject.getClass().getInterfaces(), ih);
return resultObject;
}
}
终端用户Lessee 类 调用实例:
package com.longewri.proxy.demo01;
/*
* 终端用户(租户) 调用实例
* */
public class Lessee {
public static void main (String[] args){
//静态工厂动态生成代理主题角色
Rent rt=(Rent)ProxyFactory.getProxy(new Landlord());
rt.rent();
}
}
执行结果如下:
中介代缴房屋租金和押金.
房东将房屋出租,交易成功!
中介给你房屋钥匙和租房合同.
贴上 静态代理和动态代理的代码,见附件