太晚了,有些东西没有补充,回头再补上。
先上Demo
1.要执行的方法
package enhancerTest;
/**
* Created by LiuSuSu on 2017/3/26.
*/
public class UserService {
public void doxx(){
System.out.println("do...");
}
}
2. 代理类
package enhancerTest;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* Created by LiuSuSu on 2017/3/26.
*/
public class CglibCallBackUserService implements MethodInterceptor {
/**
* cglib调用的
*
* @param o 调用对象
* @param method 调用的方法
* @param args 参数
* @param methodProxy 代理的方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("before " + method.getName());
//注意invoke代理的是自己,这是一个递归,死循环
//Object obj= methodProxy.invoke(o, args);
Object obj = methodProxy.invokeSuper(o, args);
System.out.println("after " + method.getName());
return obj;
}
}
3.测试方法
package enhancerTest;
import org.springframework.cglib.proxy.Enhancer;
/**
* Created by LiuSuSu on 2017/3/26.
*/
public class EnhanceTest {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new CglibCallBackUserService());
UserService service = (UserService) enhancer.create();
service.doxx();
System.out.println("over");
}
}
4.运行结果
before doxx
do...
after doxx
over
灵活性上远远大于传统的代理模式。