动态代理
动态代理就是帮助购买商品,这样顾客就不用再主动购买一个个零售的配件
代理模型解析:顾客A商店B 厂商C
顾客需要购买商品H不用自己去厂商C购买直接去商店B,就比如我们去零食店购买零食而不是去零食生成商哪里购买
实现动态代理需要做的条件:
1,继承接口InvocationHandler
2,实现接口内的方法:invoke(Object proxy, Method method, Object[] args)
参数解析:
(1)proxy:实现接口的实例
(2)method:被代理的那个实例的方法
(3)args:方法的参数信息
Proxy接口的解析
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
方法集合:
1,getInvocationHandler(Proxy):返回指定代理实例的调用处理程序。
2,getProxyClass(loader,interfaces):返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。
loader - 定义代理类的类加载器
interfaces - 代理类要实现的接口列表
3,newProxyInstance(loader,interfaces,h):返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
loader - 定义代理类的类加载器
interfaces - 代理类要实现的接口列表
h - 指派方法调用的调用处理程序
*具体例子解析
1,代理商
public class DynamicProxy implements InvocationHandler{
//声明需要被代理的对象
private Object obj;
//创建有参数构造器
public DynamicProxy(Object obj){
this.obj=obj;
}
//获得代理对象 假如是代理购买 “面包” 是用来代理 被代理的对象
public Object getProxy(){
//为obj 产生一个代理对象
/**1 obj.getClass().getClassLoader():被代理对象的类加载器
* 2 obj.getClass().getInterfaces():被代理对象的实现的所有的接口
* 3 this :InvocationHandler 对象
*/
//返回此 Object 的运行时类。
Class c1 = obj.getClass();
//返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口。
//也就是代理对象的类加载器(class)
ClassLoader loader = c1.getClassLoader();
//代理类要实现的接口列表
Class[] interfaces= c1.getInterfaces();
//this 代表实现接口的那个类,传递的就是调用接口InvocationHandler实现的方法(invoke)的调用
//创建代理的对象(返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。)
Object objproxy=Proxy.newProxyInstance(loader, interfaces, this);
return objproxy;
}
//接口InvocationHandler需要实现的方法(内部调用,在底层代码实现)
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("---------------开始--------------");
method.invoke(obj, args);
System.out.println("------------结束------------");
return null;
}
}
2,顾客
public class Customer {
public static void main(String[] args) {
// 创建一个对象 表示 “被代理的对象”
Mainboard md=new Mainboard();
//创建需要购买的对象名
CPU c=new CPU();
//获取一个代理商对象 把商品名给代理商
DynamicProxy dp=new DynamicProxy(c);
//得到代理商品的对象
Isale is=(Isale) dp.getProxy();
is.buy();
}
}