Java动态代理和AOP编程
来源:互联网 发布:c 编程实战宝典 pdf 编辑:程序博客网 时间:2024/06/08 15:10
一, 动态的核心
动态代理的两个核心,Proxy 和 InvocationHandler,都是Java.lang.reflect包下的接口类;由此也可以看出动态代理是反射的高级应用!
代理与反射的关系如何体现?从代理的建立过程的构建方法及其参数可见一斑:
1,代理最核心的Handler的唯一方法invoke()的核心参数Method method,是一个Class类型,并且在代理调用时,invoke到target对象来返回retval.
2,代理的构造方法参数, 也就是牛X的newProxyInstance()方法的前两个参数, 是目标接口的ClassLoader 和 Interface[ ],也是通过接口Class对象反射get到;
二, 代理的调用方法
Object invoke(Object proxy, Method method,Object[] args) 方法,该方法 在代理实例上处理方法调用并返回结果。
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
三个参数的意思是:
Object proxy 在其上调用方法的代理实例
Method method 对应于在代理实例上调用的接口方法的Method 实例
Object[] args 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为null
三, 代理实例的创建
方法一.1,通过Proxy.getProxyClass()方法创建若干接口的Class文件,
2,通过Class文件可以得到其构造方法
3,最后通过构造方法实例的newInstance方法得到代理实例
方法二.,通过Proxy的newProxyInstance() 方法,直接返回一个带有代理类的指定调用处理程序的代理实例,
它由指定的类加载器定义,并实现指定的接口
该方法的参数列表是:
ClassLoader loader, 指定一个类加载器用于加载指定的接口
Class<?>[] interfaces, 给出需要创建代理实例的接口
InvocationHandlerh, 给出代理实例的调用处理程序实现的接口
显而易见,方法二是对代理逻辑的代码重新封装,有利于编写和管理三大代理构建参数,使大家可以集中精力去处理invoke()方法, target对象,切面信息(Advice),实现AOP编程;
以下为Proxy实例的建立,和进一步AOP编程的应用:
static void clazzProxy()throws Exception{ ClassclazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader() ,Collection.class); System.out.println(clazzProxy1.getName()); System.out.println("---------------constructorslist--------------"); Constructor[]constructors = clazzProxy1.getConstructors(); for(Constructorconstructor : constructors){ Stringname = constructor.getName(); StringBuildersBuilder = new StringBuilder(name); sBuilder.append('('); Class[]clazzParams = constructor.getParameterTypes(); for(ClassclazzParam:clazzParams){ sBuilder.append(clazzParam.getName()).append(','); } if(clazzParams.length==0) sBuilder.deleteCharAt(sBuilder.length()-1); sBuilder.append(')'); System.out.println(sBuilder); } System.out.println("-------------begincerate instance --------------"); Constructorconstructor = clazzProxy1.getConstructor(InvocationHandler.class); classMyInvocationHandler1 implements InvocationHandler{ @Override publicObject invoke(Object arg0, Method arg1, Object[] arg2) throwsThrowable { //TODO Auto-generated method stub returnnull; } }; Collectionproxy1 = (Collection)constructor.newInstance(new MyInvocationHandler1()); System.out.println("xxxxxxxxx"+proxy1.toString());//没有返回值的方法可以调用。有返回值的方法,可以调用 //proxy1.size();//不能调用,因为其没有指定目标 proxy1.clear();//可以调用 Collectionproxy2 = (Collection)constructor.newInstance(new InvocationHandler(){ ArrayListtarget = new ArrayList(); @Override publicObject invoke(Object proxy, Method method, Object[] args) throwsThrowable { longbeginTime = System.currentTimeMillis(); ObjectretVal = method.invoke(target,args); longendTime = System.currentTimeMillis(); System.out.println(method.getName()+"运行时间"+(endTime-beginTime)); returnretVal; } }); proxy2.add("zxx"); proxy2.add("Java01"); proxy2.add("Java"); proxy2.size(); Collection proxy3 = (Collection)Proxy.newProxyInstance( Collection.class.getClassLoader(), newClass[]{Collection.class}, newInvocationHandler(){ ArrayList target = new ArrayList(); @Override publicObject invoke(Object proxy, Method method, Object[] args) throwsThrowable { longbeginTime = System.currentTimeMillis(); Object retVal = method.invoke(target,args); longendTime = System.currentTimeMillis(); System.out.println(method.getName()+"运行时间:"+(endTime-beginTime)); return retVal; } } ); proxy3.add("Java01"); proxy3.add("Java02"); proxy3.add("Java03"); System.out.println(proxy3.size()); } }
- Java动态代理和AOP编程
- Java动态代理之JDK动态代理和CGLib动态代理 面向切面编程AOP原理
- JAVA中的动态代理和AOP编程思想
- JAVA AOP编程之动态代理技术
- 动态代理和AOP切面编程
- AOP编程之JDK动态代理和Cglib动态代理
- AOP编程+动态代理
- AOP和动态代理
- JAVA 动态代理与AOP编程(面向切面编程)
- Spring -AOP -java静态代理和动态代理实例
- 黑马程序员 Java创建动态代理类实现Aop编程
- java技术之动态代理以及AOP编程
- 动态代理(2)----动态代理和AOP
- 动态代理(2)----动态代理和AOP .
- Java动态代理实现AOP
- java动态代理实现aop
- java动态代理实现AOP
- java的动态代理(AOP)
- js操作基础
- man strtok [使用strtok_r()函数例子]
- openfire 源码的安装与部署测试
- 栈在表达式计算中的应用
- 《数据结构》 第一章 思维导图 信管1132-19
- Java动态代理和AOP编程
- 由一定范围的质数的输出问题所得break、continue总结。
- 工作解决问题
- 引用2
- 不相关进程间通信--命名管道(FIFO文件)
- GDB调试精粹及使用实例
- ios 代码 自动布局(一)
- 重拾linux 驱动 2----在dev 文件下显示驱动名字
- 用HOSTS文件屏蔽网站