CGLib动态代理
- - ITeye博客 由于JDK创建代理有一个限制,它只能为接口创建代理实例,那么对于没有通过接口定义业务方法的类,如何动态创建代理实例呢. 显然CGLib是一个很好的选择,CGLib采有底层的字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用. 下面就看一下CGLib如何实现动态代理吧.
/** * 代理目标类 * @author Leeo * */ class Task { public Task() { } public void run() { System.out.println("hello..."); } }
/** * 采用CGLIB实现动态代理 * @author Leeo * */ class CglibProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); @SuppressWarnings("unchecked") public Object getProxy(Class clazz) { enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("begin......" + obj.getClass().getName() + "." + method.getName()); // 通过代理类调用父类中的方法 Object result = proxy.invokeSuper(obj, args); System.out.println("end......"); return result; } }
/** * CGLib 动态代理测试 * @author Leeo * */ public class CglibProxyTest { public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); Task task = (Task) proxy.getProxy(Task.class); task.run(); } }