最近在看Aop的东西,正在了解这方面的东西。这篇主要是记录一个最简单的cglib编程示例。
创建项目,添加maven依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
编写被代理对象
public class Dog {
public void run() {
System.out.println(" dog run ..");
}
}
用cglib编写代理对象
public class CglibProxy implements MethodInterceptor {
private Object proxy;
public CglibProxy(Class clazz) {
Enhancer enhancer = new Enhancer();
//设置需要创建的子类
enhancer.setSuperclass(clazz);
//通过字节码技术动态创建子类实例
enhancer.setCallback(this);
this.proxy = enhancer.create();
}
public Object getProxy() {
return proxy;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("after");
return result;
}
}
Client测试类
public class Client {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy(Dog.class);
Dog dog = (Dog)proxy.getProxy();
dog.run();
}
}
运行结果
before
dog run ..
after
一般来说,JDK动态代理创建速度快,运行效率低;cglib创建速度慢,运行效率高。