动态代理:
既通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联
例如:买房子
找到中介,需求给中介完成,客户只需要最后确认满意付款就OK了
java动态代理主要是使用java.lang.reflect包中的两个类。
代码示例:
1、主题:关注的是啥
package proxy;
/**
* 主题:关注的是啥
* @author lemonsun
*/
public interface Subject {
//购物
public void shopping();
}
2、需求者:我们想要做什么
package proxy;
/**
* 需求者:我们想要做什么
* @author lemonsun
*/
public class Person implements Subject{
@Override
public void shopping() {
//我们只需要结果 过程由代理完成(类似中介)
System.out.println("付款,买到想要的物品!");
}
}
3、用于动态生成一个代理对象:(找到我们需要的中介商:例如 房屋中介,其他中介)
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 用于动态生成一个代理对象:(找到我们需要的中介商:例如 房屋中介,其他中介)
* @author lemonsun
*/
public class CreateProxy implements InvocationHandler {
private Object traget; //被代理对象 (中介给谁办事)
//用于创建代理对象的方法 (就是找一个中介)
public Object create(Object traget){
this.traget = traget;
//获取加载对象 /*1、类加载器 2、目标对象所在类实现的接口的所有方法 3、参数*/
Object proxy = Proxy.newProxyInstance(traget.getClass().getClassLoader(),
traget.getClass().getInterfaces(), this);
return proxy; //返回代理对象
}
/**
* 代理对象要执行的方法:(中介需要做的事)
* @param proxy 代理类对象(中介)
* @param method 被代理对象的方法
* @param args 被代理对象方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("查找客户需要的房源...");
//假设已经找到合适的房子
System.out.println("跟客户确认房子");
//确认后开始付款
method.invoke(traget,args);//无参数 写args没有返回值
System.out.println("完成本次购房!");
return null;
}
}
4、测试类
package proxy;
import org.junit.Test;
/**
* @author lemonsun
*/
public class TestProxy {
@Test
public void testProxy(){
CreateProxy cP = new CreateProxy(); //用来创建代理对象的对象(中介)
Subject person = new Person(); //被代理的对象 (客户)
Subject proxy = (Subject)cP.create(person); //
proxy.shopping(); //invoke
}
}