Cglib动态代理技术,采用底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截技术拦截所有父类方法的调用,并植入增强。
a、--CglibProxy 用于创建子类,并拦截父类所有方法的调用同时织入增强
b、--CglibTask 测试业务类
c、--CglibTest 测试
--CglibProxy
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* Created by weiyuan on 2018/7/10/010.
*/
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
//创建子类
public Object getProxy(Class clazz) {
//设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}
//拦截父类所有方法的调用
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("开始。。。。");
//通过代理调用父类方法
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("完成。。。。。");
return result;
}
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* Created by weiyuan on 2018/7/10/010.
*/
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
//创建子类
public Object getProxy(Class clazz) {
//设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}
//拦截父类所有方法的调用
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("开始。。。。");
//通过代理调用父类方法
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("完成。。。。。");
return result;
}
}
--CglibTask
public class CglibTask {
public void sayHi(){
System.out.println("hi...");
}
public void sayHi(){
System.out.println("hi...");
}
}
--CglibTest
public class CglibTest {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
//通过动态生成子类的方式创建代理类
CglibTask task = (CglibTask) proxy.getProxy(CglibTask.class);
task.sayHi();
}
}
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
//通过动态生成子类的方式创建代理类
CglibTask task = (CglibTask) proxy.getProxy(CglibTask.class);
task.sayHi();
}
}