1、对于JDK的动态代理,进行了一个简单的封装。以便于操作起来更简单。
2、IUserDao.java接口的定义
public interface IUserDao {
public void add();
public void delete();
}
3、UserDao.java的实现
public class UserDao implements IUserDao {
@Override
public void add() {
System.out.println("add...");
}
@Override
public 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;
}
/***
* 通过代理实现调用,在里面加上方法增强的逻辑
*/
@Override
public 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);
}
@Override
public void onException(Exception ex) {
ex.getMessage();
}
@Override
public void after(Object[] args) {
System.out.println("end...");
}
@Override
public void before(Object[] args) {
System.out.println("start...");
}
}
6、测试代码
public class ProxyTest {
@Test
public void test02() {
// 要被代理的对象
UserDao target = new UserDao();
IUserDao iUserDao = new ProxyUtil<IUserDao>(target).getProxy();
iUserDao.add();
}
}
7、源码的下载地址