/**
*代理类对象,是目标对象的子类
*/
publicclass CglibProxy {
/**
* 创建Cglib动态代理对象
* @param targetObejct 目标对象
* @param t 扩展对象,是一个拦截器
* @return代理对象
*/
publicstatic ObjectnewProxyInstance(UserDAOImpl targetObejct,TimeInterceptor t) {
//字节码增强工具,可以在内存中动态产生字节码
Enhanceren = new Enhancer();
en.setSuperclass(targetObejct.getClass());//指定代理类的父类
en.setCallback(t);//代理类对应的扩展对象。
return en.create(); //创建代理对象返回
}
}
/**
*扩展类对象
*/
publicclass TimeInterceptor implements MethodInterceptor{
@Override
public Objectintercept(Object proxyObject, Method method, Object[] args, MethodProxymethodProxy) throws Throwable {
//扩展代码
System.out.println("start time:" +new Date());
//method为targetObject的方法名,也可以反射调用
//Object result = method.invoke(targetObejct, args);
//可以通过代理方法对象,调用父类的方法。
Objectresult = methodProxy.invokeSuper(proxyObject, args);
//扩展代码
System.out.println("end time:" +new Date());
return result;
}
}
/**
*目标类对象
*/
publicclass UserDAOImpl{
publicvoid delete() {
System.out.println("delete ... ");
}
publicvoid insert() {
System.out.println("insert ... ");
}
publicvoid select() {
System.out.println("select ... ");
}
publicvoid update() {
System.out.println("select ... ");
}
}
/**
*测试
*/
publicclass TestCglibProxy {
publicstaticvoid main(String[] args){
//目标对象
UserDAOImpltargetObejct = new UserDAOImpl();
//扩展对象
//TimeInterceptor t = new TimeInterceptor(targetObejct);
TimeInterceptort = new TimeInterceptor();
//Cglib代理对象: 代理类继承目标类
ObjectproxyObject = CglibProxy.newProxyInstance(targetObejct,t);
//因为代理类是目标类的子类,所以可以将对象转换为目标对象类型
UserDAOImpl proxy = (UserDAOImpl)proxyObject;
//调用代理对象的方法,会自动调用到扩展对象的intercept方法。
proxy.insert();
proxy.delete();
}
}