上一篇文章中我们介绍了如何使用java SDK实现动态代理,可是因为java SDK只能为接口创建代理所以有一定的局限性,今天我来给大家介绍另外的一种实现java动态代理的方法就是使用第三方的类库叫做cglib。
首先我们来使用cglib实现一个动态代理然后在来介绍一些注意的事项:
public class ProxyCglibTest { static class RealService { public void say() { System.out.println("i am realService!"); } } static class ProxyInterceptor implements MethodInterceptor{ @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("say before"); Object result = proxy.invokeSuper(object, args); System.out.println("say after"); return result; } } public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(RealService.class); enhancer.setCallback(new ProxyInterceptor()); RealService realService = (RealService)enhancer.create(); realService.say(); } }
其中RealService是被代理的对象,它没有实现任何的接口。我们使用cglib的Enhancer来创建代理对象,其中setSuperClass用来设置被代理的类,setCallback用来设置被代理对象的方法被调用时的处理类。处理类ProxyInterceptor实现了MethodInterceptor接口,这里需要注意的是object是代理对象,在ProxyInterceptor没有被代理对象,所以只能通过MethodProxy的invokeSuper来调用被代理类的方法。注意如果使用method.invoke(object, args)来调用被代理类的方法会造成死循环。