您的位置:首页 > 编程语言 > Java开发

关于java基础--动态代理

2015-07-24 20:04 513 查看

动态代理

动态代理就是帮助购买商品,这样顾客就不用再主动购买一个个零售的配件

代理模型解析:顾客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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: