cglib只能通过类实现代理,不能通过接口正好与java动态代理互补
实例
public class Test {
//测试手动的cglib动态代理
@org.junit.Test
public void testCglibDynamisProxy(){
Phone phone = CglibDynamisProxy.getInstace().getProxy(MyPhone.class);
phone.name("苹果");
}
}
//cglib实现类---通过实现MethodInterceptor接口
public class CglibDynamisProxy implements MethodInterceptor{
public static CglibDynamisProxy cglibDynamisProxy = new CglibDynamisProxy();
private CglibDynamisProxy() {
}
public static CglibDynamisProxy getInstace(){
return cglibDynamisProxy;
}
/**
* 对外提供代理对象的通用方法
* Class<T> cla 目标类的子类
* @param cla
* @return
*/
public <T>T getProxy(Class<T> cla){
//内部有一个增强类Enhancer
return (T)Enhancer.create(cla, this);
}
/**
* 代表拦截目标类所有的方法
*/
@Override
public Object intercept(Object target, Method method, Object[] arg2, MethodProxy proxy) throws Throwable {
beforeFun();
//通过反射调用核心业务方法
Object result = proxy.invokeSuper(target, arg2);
afterFun();
return result;
}
/**
* 手动定义增强方法
*/
public void beforeFun(){
System.out.println("前置代理");
}
public void afterFun(){
System.out.println("后置代理");
}
}
打印结果
前置代理
手机的名字是苹果
后置代理