准备工作导包
cglib-2.2.2.jar asm-3.3.1.jar
首先写出被代理的类(里面随便写某个method)
public class UserDao {
public void save() {
System.out.println("保存成功。。。");
}
}
然后写代理类
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class UserDaoProxy {
//首先要获取被代理的对象
private UserDao userDao=null;
public UserDaoProxy(UserDao userDao) {
this.userDao=userDao;
}
/**
* 该方法用于返回代理对象
*/
public Object getObject() {
//第一步 声明这个enhancer
Enhancer enhancer=new Enhancer();
//第二部:设置该代理对象的爹
enhancer.setSuperclass(userDao.getClass());
//第三部:设置他爹监听里面的回掉
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
String methodName=method.getName();
Object returnValue=null;
if("save".equals(methodName)){ //说明调用了我们要监听的这个方法
System.out.println("添加事务");
//执行方法
returnValue=method.invoke(userDao, arg2);
//关闭事物
System.out.println("关闭事务");
}else{
returnValue=method.invoke(userDao, arg2);
}
return returnValue;
}
});
return enhancer.create();
}
}
最后写测试方法
@Test
public void test2() throws Exception {
//首先要生成代理类
UserDaoProxy userDaoProxy=new UserDaoProxy(new UserDao());
//直接调用get方法生成代理类的对象
UserDao userDao=(UserDao) userDaoProxy.getObject();
//编译看左边
userDao.save();
}