• JDK CGLIB


    JDK动态代理采用反射,CGLIB采用字节码增强技术,效率更高。(cglib采用类似索引的方式直接调用委托类方法by FastClass机制)。

    User userService = new UserService();
    
    //实现委托分发
    InvocationHandler invocationHandler = new MyInvocationHandler(userService);
    //创建代理之后的实例
    User user = (User)Proxy.newProxyInstance(userService.getClass().getClassLoader(),
    userService.getClass().getInterfaces(),invocationHandler);
    user.getName();

    JDK中的newProxyInstance需要拿到invacationHandler的实例,来调用其中的invoke方法

    enhancer.setSuperclass(UserService.class);
    enhancer.setCallback(this);
    return enhancer.create();

    cglib使用了回调机制,即enhancer想要调用methodinterceptor的实例中的方法,但他不知道实例是谁,就写了个setCallback(MethodInterceptor mi),这样,实例传this进去,就可以调用到intercept()方法了

    [全部代码](https://github.com/aioprxu/ssm/tree/master/src/main/java/com/aiopr/proxy)

  • 相关阅读:
    BZOJ3512 DZY Loves Math IV
    HDU5608 function
    数论
    动态点分治
    tarjan
    插头DP
    斯坦纳树
    css中的display(显示)和visibility(可见性)
    简单的数据整理, 递归算法
    java链接数据库构建sql语句的时候容易记混的地方
  • 原文地址:https://www.cnblogs.com/BBchao/p/8529183.html
Copyright © 2020-2023  润新知