关于java基础--动态代理

动态代理

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

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

}

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值