java中的动态代理(三)

    上一篇文章中我们介绍了如何使用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)来调用被代理类的方法会造成死循环。

posted @ 2019-05-26 12:23  牧神风  阅读(159)  评论(0编辑  收藏  举报