10、对于JDK动态代理的一个简单封装ProxyUtil的使用

来源:互联网 发布:js 点击显示隐藏图片 编辑:程序博客网 时间:2024/06/12 01:44

1、对于JDK的动态代理,进行了一个简单的封装。以便于操作起来更简单。

2、IUserDao.java接口的定义

public interface IUserDao {public void add();public void delete();}

3、UserDao.java的实现

public class UserDao implements IUserDao {@Overridepublic void add() {System.out.println("add...");}@Overridepublic void delete() {System.out.println("delete...");}}


4、ProxyHandler.java的代码

public abstract class ProxyHandler<T> implements InvocationHandler {/** * 被代理的对象 */private T target;public ProxyHandler(T target) {this.target = target;}/** * 创建代理,如果目标类没有实现接口则返回自己 *  * @param target *            要代理的对象 * @return 得到的代理类 */@SuppressWarnings("unchecked")public T getProxy() {Class<T> cls = (Class<T>) target.getClass();// 查看目标类有没有实现接口if (cls.getInterfaces() != null) {return (T) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), this);}return target;}/*** * 通过代理实现调用,在里面加上方法增强的逻辑 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object obj = null;try {// 调用前的业务处理before(args);// 执行被代理对象的方法obj = method.invoke(target, args);// 调用后的业务处理after(args);} catch (Exception e) {// 自定义的异常方法onException(e);}return obj;}/*** * 出现异常时处理 *  * @param ex */public abstract void onException(Exception ex);/** * 调用方法后处理 *  * @param args */public abstract void after(Object[] args);/** * 调用方法前处理 *  * @param args */public abstract void before(Object[] args);}

5、ProxyUtil.java的代码

public class ProxyUtil<T> extends ProxyHandler<T> {/** * 加入被代理的对象 *  * @param target *            被代理的对象,一般都是接口的实现类 ProxyUtil<T>,是实现类的接口 */public ProxyUtil(T target) {super(target);}@Overridepublic void onException(Exception ex) {ex.getMessage();}@Overridepublic void after(Object[] args) {System.out.println("end...");}@Overridepublic void before(Object[] args) {System.out.println("start...");}}


6、测试代码

public class ProxyTest {@Testpublic void test02() {// 要被代理的对象UserDao target = new UserDao();IUserDao iUserDao = new ProxyUtil<IUserDao>(target).getProxy();iUserDao.add();}}

7、源码的下载地址

源码的下载



1 0