为什么要实现动态代理,动态代理可以实现无侵入式的代码功能扩展,即方法的增强,这也正是Java动态代理的优势让你可以在不用修改源码的情况下,在方法的前后增加我们想做的任何想做的事情,从而实现程序解耦。JAVA是利用反射机制在运行时创建代理类,由代理类生成返回我们的最终要用的处理类,然后调用返回的类的方法即可。动态代理是让程序可以实现AOP编程,AOP是代理模式的一个典型应用;本文地址:http://47.93.183.36/article/875.html,未经许可,不得转载.
JAVA动态代理实现步骤:
1. 通过实现 InvocationHandler 接口创建自己的动态代理类;
2. 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
3. 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
4. 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。本文地址:http://47.93.183.36/article/875.html,未经许可,不得转载.
如下我们创建一个interface和其实现本文地址:http://47.93.183.36/article/875.html,未经许可,不得转载.
//定义一个interfac package proxy; public interface ArticleInterface { public void query(); public void add() ; public void edit() ; public void delete() ; } //实现上面的interface package proxy; public class Article implements ArticleInterface{ public void query() { System.out.println("获取了一篇文章"); } public void add() { System.out.println("添加了一篇文章"); } public void edit() { System.out.println("修改了一篇文章"); } public void delete() { System.out.println("删除了一篇文章"); } }本文地址:http://47.93.183.36/article/875.html,未经许可,不得转载.
接着我们来实现一个通用的代理类,代码如下,它主要做三件事,1是实现InvocationHandler类并提供外部注入通用的object对象,2是提供给外部一个获取代理类的方法,这里就是利用反射提供这个类,而不是直接提供的一个new 对象。3是必须实现InvocationHandler类的抽象方法invoke,里面直接可调用类的方法method,而我们想在方法前后加的其它功能均可在此处实现。如程序中我们在方法执行后添加一条操作日志记录。此代理类和测试类代码如下:本文地址:http://47.93.183.36/article/875.html,未经许可,不得转载.
package com.kermit.dotest; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class NormalInvocationHandler implements InvocationHandler { private Object object; //设置代理类 public void setObject(Object object) { this.object = object; } //生成代理类 public Object getObject () { return Proxy.newProxyInstance(this.getClass().getClassLoader(), object.getClass().getInterfaces(), this); } //调用代理方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object res = method.invoke(object, args); log(method.getName()); return res; } //执行通用方法 public void log(String method) { System.out.println("[日志]:执行" + method + "方法"); } } //测试类 package com.kermit.dotest; import proxy.Article; import proxy.ArticleInterface; public class ProxyTest { public static void main(String[] args) { NormalInvocationHandler normal = new NormalInvocationHandler(); Article article = new Article(); normal.setObject(article); ArticleInterface proxy = (ArticleInterface) normal.getObject(); proxy.add(); proxy.edit(); proxy.query(); proxy.delete(); } } //测试类执行结果 添加了一篇文章 [日志]:执行add方法 修改了一篇文章 [日志]:执行edit方法 获取了一篇文章 [日志]:执行query方法 删除了一篇文章 [日志]:执行delete方法本文地址:http://47.93.183.36/article/875.html,未经许可,不得转载.
本文地址:http://47.93.183.36/article/875.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
手机扫码直接打开本页面 |