• 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)来调用被代理类的方法会造成死循环。

  • 相关阅读:
    19-1 在页面中渲染基本的组件
    19 使用Vue实例的render方法渲染组件
    17 webpack中babel的配置
    前端待复习汇总
    301,302,303,307重定向区别
    尾递归
    Binary-to-text ecoding:
    object Object {} any unknown
    Vue中的model
    全局namespace与模块内的namespace
  • 原文地址:https://www.cnblogs.com/suyang-java/p/10925647.html
Copyright © 2020-2023  润新知