zoukankan      html  css  js  c++  java
  • 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)来调用被代理类的方法会造成死循环。

  • 相关阅读:
    开发流程
    团队模式
    android studio 中点击button加1或者减1
    登录注册界面的测试点
    用在线工具processOn画UML的用例图和时序图
    android studio中R文件丢失了
    第一次迭代任务
    WBS(work Breakdown Structure)
    #“速达” app NABCD分析
    “速达”app电梯演说
  • 原文地址:https://www.cnblogs.com/suyang-java/p/10925647.html
Copyright © 2011-2022 走看看