动态代理
2015-10-23 00:00
513 查看
JDK动态代理需要一个invocation handler来处理方法的调用,该handler需要实现InvocationHandler接口。第一个参数代表代理实例,第二个是正在代理的方法,第三个是方法的参数。
假设有个接口,用来进行加减乘除:
以及它的实现类:
我们希望在计算器运算时进行一些额外的操作,比如日志等。可以通过实行InvocationHandler接口,编写一个记录方法起始和结束的调用处理程序。
测试:
版权声明:本文为博主原创文章,未经博主允许不得转载。
package java.lang.reflect; public interface InvocationHandler{ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
假设有个接口,用来进行加减乘除:
public interface ICalc { public int add(int a,int b); public int minus(int a,int b); public int times(int a,int b); public int divide(int a,int b); }
以及它的实现类:
public class CalcImp implements ICalc { public int add(int a, int b) { return a+b; } public int divide(int a, int b) { if(b == 0){ throw new IllegalArgumentException(); } return a/b; } public int minus(int a, int b) { return a-b; } public int times(int a, int b) { return a*b; } }
我们希望在计算器运算时进行一些额外的操作,比如日志等。可以通过实行InvocationHandler接口,编写一个记录方法起始和结束的调用处理程序。
public class CalcLogHandler implements InvocationHandler{ private Object target; public CalcLogHandler(Object target) { super(); this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法执行前的操作 System.out.println("执行前"); Object result=method.invoke(target, args); //方法执行后的操作 System.out.println("执行后"); return result; } }
测试:
public static void main(String[] args) { ICalc calcImp=new CalcImp(); ICalc calc=(ICalc)Proxy.newProxyInstance( calcImp.getClass().getClassLoader(), calcImp.getClass().getInterfaces(), new CalcLogHandler(calcImp)); calc.add(2, 3); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- android string.xml文件中的整型和string型代替
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- fastjson处理接口时的一个问题
- String.intern
- Ubuntu 安装 JDK 问题
- mysql集群之MMM简单搭建
- 通晓网络测试常用命令
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- C#中struct和class的区别详解
- PostgreSQL ERROR: invalid escape string 解决办法
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- c# 所有类型都从Object类型派生
- C#中实现Fluent Interface的三种方法