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

  • 相关阅读:
    uva11636-Hello World!
    POJ3083 Children of the Candy Corn(Bfs + Dfs)
    POJ2251-Dungeon Master
    使用 reqwest库,json,ajax传递api数据
    If no other git process is currently running, this probably means a git process crashed in this repo
    django配置数据驱动,python安装失败问题
    同时安装py2与py3时的pip使用问题
    Python代码之购物车
    Python代码之三级登录
    Python代码之登录接口
  • 原文地址:https://www.cnblogs.com/suyang-java/p/10925647.html
Copyright © 2011-2022 走看看