JDK动态代理proxy,InvocationHandler

好久没有写文章了,今天看碰到一个问题,记录一下动态代理的解决办法


从测试找思路,这叫极限编程,哈哈
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其实原理都是如此。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值