关于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();
}
}
相关文章推荐
- 从一个“变态”的题看“分析Java源代码”的重要性!
- Java基本语法--运算符
- Java继承类中static成员函数的重写
- Java集合框架学习笔记
- Struts2的配置以及详解
- Spring的配置以及详解
- 用Java进行AES256-ECB-PKCS7Padding加密
- Java转型(向上或向下转型)
- java多线程
- Java Lock Condition
- bj Java初学2015-07-24
- JAVA时间类
- 无Maven不项目---使用Eclipse快速搭建Maven项目
- Spring(八)编码剖析@Resource注解的实现原理
- Myeclipse如何自动创建hibernate
- 认识JAVA
- 最奇葩的java错误,让我深深不能忘记。
- 算法(第四版)学习笔记之java实现归并排序
- Java内存区域与模拟内存区域异常
- 使用myeclipse与SQLyog怎么建立简单的登陆页面