好久没有写文章了,今天看碰到一个问题,记录一下动态代理的解决办法
从测试找思路,这叫极限编程,哈哈
public class ProxyTest {
@Test
public void testProxyUserDao(){
UserDAO userDao = new UserDAOImpl();
//handle代理
LogInterceptor logHandle = new LogInterceptor();
logHandle.setObj(userDao);
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), logHandle);
//userDAOProxy.delete("22");
userDAOProxy.insert(new User());
System.out.print("userDAOProxy产生的代理对象:"+userDAOProxy.getClass().getName());
/*
* 打印出来的代理对象名称Proxy4
* 可以想象代理对象如下:
* class Proxy4{
*
* public void insert(User user){
* Method m = userDao.getClass().getMethod("insert");
* logHandle.invoke(this,m,args);
*
* }
*
* }
*
*/
}
}
2.被代理对象的实现类
public class UserDAOImpl implements UserDAO {
@Override
public void insert(User user) {
System.out.println("调用UserDAOImpl--insert方法");
}
@Override
public void delete(String id) {
System.out.println("调用UserDAOImpl---delete方法");
}
}
3.invocationHandle对象
public class LogInterceptor implements InvocationHandler {
private Object obj;
/**
* 描述: 日志记录
* @auther gqf
* @date 2014年7月6日
*/
public void doAddLog(){
System.out.println("调用了日志interceptor记录-----------");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
doAddLog();
method.invoke(obj, args);
return null;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
@Override
public void insert(User user) {
System.out.println("调用UserDAOImpl--insert方法");
}
@Override
public void delete(String id) {
System.out.println("调用UserDAOImpl---delete方法");
}
}
其它代码就没有什么,可以想到了,哈哈
这种方法必须要接口,才能产生代理对象。从测试思路可以看出,可以产生任意接口的代理对象,同时可以植入接口中的任意方法。
是个好东西,像servlet中的filter,spring aop,strut interceptor其实原理都是如此。