JDK动态代理
来源:互联网 发布:在线数据图表处理软件 编辑:程序博客网 时间:2024/06/05 11:57
一 ,什么是代理?
代理 : 本来是自己应该做的事, 却请了别人来做, 被请的人就是代理对象
举例 : 春节回家买票找人代买, 黄牛就是代理对象
二 ,什么是动态代理?
代理的对象是变动的, 在程序运行过程中产生的 . 而在程序运行过程中产生对象, 这个对象是不固定的, 那么可以通过反射来实现, 所以动态代理是基于反射实现的.
三 ,动态代理常见有JDK提供的动态代理,和Cglib提供的代理 , 这次介绍JDK提供的代理
1, 在java中java.lang.reflect包下提供了一个Proxy类和InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象. JDK提供的代理只能针对接口做代理. Cglib提供的代理会更强大一些.
2, Proxy类中的方法创建动态代理类对象,该方法会返回代理类
Public static ObjectnewProxyInstance(ClassLoader loader, Class<?>[] intergaces,InvocationHandler h )
最终会调用InvocationHandler的方法
3, InvocationHandler接口 , 定义动态代理要实现的具体业务逻辑
Object invoke(Objectproxy, Method method , Object[] args );
自定义类实现IncovationHandler接口, 复写invoke()方法, 具体代理的逻辑写在该方法中. invoke()方法执行后的返回值为代理对象 .
代码举例:1,创建要代理的接口和实现类
public interface UserDao {void add();void delete();}public class UserDaoImp implements UserDao{ public void add() { System.out.println("执行了添加的方法"); } public void delete() { System.out.println("执行了删除的方法"); } }public interface WorkDao { void work(); void study(); }public class WorkDaoImp implements WorkDao { public void work() { System.out.println("工作"); } public void study() { System.out.println("学习"); }}
2,创建InvocationHandler接口的实现类,具体代理的业务逻辑在Invoke方法
/** * 自定义类实现IncovationHandler接口, 复写invoke()方法 */public class MyInvocationHandler implements InvocationHandler {private Object target; //目标对象public MyInvocationHandler(Object target){this.target = target;}/** * 在代理实例上处理方法调用并返回结果 * proxy - 在其上调用方法的代理实例 * method - 对应于在代理实例上调用的接口方法的 Method 实例 * args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null */public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("权限校验");//invoke 方法执行后的返回值为代理类对象Object result = method.invoke(target, args);System.out.println("日志分析");return result; //返回代理类对象}}
3,测试类,Proxy类中的方法创建动态代理类对象,该方法会返回代理类
public class ProxyTest {/** * 使用JDK动态代理,在原来的方法执行前后执行授权,日志记录 * @param args */public static void main(String[] args) {UserDao userDao = new UserDaoImp();//不使用代理的情况下调用方法userDao.add();userDao.delete();//代理用户MyInvocationHandler myInvocationHandler = new MyInvocationHandler(userDao);//返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序//返回对象只能是接口UserDao,不能是接口的实现类UserDaoImp,所以说JDK提供的代理只能针对接口做代理UserDao newProxyInstance = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(),myInvocationHandler);newProxyInstance.add();newProxyInstance.delete();System.out.println("--------------------------------");WorkDao workDao = new WorkDaoImp();//不使用代理的情况下调用方法workDao.work();workDao.study();//代理工人MyInvocationHandler myInvocationHandler2 = new MyInvocationHandler(workDao);WorkDao newProxyInstance2 = (WorkDao) Proxy.newProxyInstance(workDao.getClass().getClassLoader(), workDao.getClass().getInterfaces(), myInvocationHandler2);newProxyInstance2.work();newProxyInstance2.study();}}
4, 控制台输出 , 在方法执行前后执行了授权和添加日志的方法,具体方法中业务逻辑可以根据实际情况定义
执行了添加的方法
执行了删除的方法
权限校验
执行了添加的方法
日志分析
权限校验
执行了删除的方法
日志分析
--------------------------------
工作
学习
权限校验
工作
日志分析
权限校验
学习
日志分析
- 代理模式,JDK动态代理
- Java动态代理--jdk代理
- 代理模式-JDK动态代理
- JDK中的动态代理
- JDK动态代理
- JDK动态代理
- JDK动态代理
- jdk动态代理(暂)
- JDK动态代理
- JDK动态代理实例
- jdk 动态代理
- JDK动态代理
- JDK动态代理说明
- jdk动态代理
- JDKDynamicProxy JDK动态代理
- JDK动态代理实现
- JDK 动态代理
- JDK动态代理
- linux修改文件所属用户和组
- 学习编写shell脚本(一)
- 泣血关于mysql安装卸载安装卸载
- listview,gridview里面通过一个item控制所有item的使用方法
- 第七节:定长与变长Array
- JDK动态代理
- 腾讯地图定位demo
- 匿名函数
- DOM4J操作XML
- ROS(Robot Operating System)常用环境变量介绍
- vim编辑代码自动补全设置
- 欧拉函数的一些模板+注释
- Eclipse中SVN修改的*星号没了,解决方法
- 第八节:Array的遍历-转换以及-常规用法