动态代理有哪些实现方式,有什么区别

动态代理

什么是动态代理

使用反射技术和字节码的技术,在运行期创建指定接口或类的子类(动态代理)以及其实例对象的技术,通过这个技术可以无侵入性的为代码进行增强;


先来回忆一下 class源文件的实例过程

动态代理有哪些实现方式,有什么区别

根据上面的定义来看整个过程就是跳过了原class文件

动态代理有哪些实现方式,有什么区别

实现动态代理

jdk原生的动态代理

CGLIB

show code

公共类:

/**
 * @Author: jimmy
 * @Date: 2021/9/2 11:40
 * @Description:
 */
public class User {

    private String name;
    private int age;
    private String sex;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + ''' +
                ", age=" + age +
                ", sex='" + sex + ''' +
                ", password='" + password + ''' +
                '}';
    }
}

public interface UserService {
    void printUser(User user);
}

public class UserServiceImpl implements UserService {
    @Override
    public void printUser(User user) {
        System.out.println(user);
    }
}

jdk代理:

public class JDKUserInvocationHandler implements InvocationHandler {

    // 原始对象
    private Object obj;

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public JDKUserInvocationHandler(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(args !=null && args[0] instanceof User){
            User u = (User)args[0];
            if(u.getAge() > 80){
                System.out.println("jdk: 你这个人有点长寿啊");
            }
        }
        Object res = method.invoke(obj, args);
        System.out.println("----------  jdk调用方法后  ----------");
        return res;
    }
}

cglib:

public class CglibMethodIntercepter implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        if(args !=null && args[0] instanceof User){
            User u = (User)args[0];
            if(u.getAge() > 80){
                System.out.println("cglib: 疯狂暗示");
            }
        }
        Object res = methodProxy.invokeSuper(o, args);
        System.out.println("----------  cglib调用方法后  ----------");
        return res;
    }
}

测试类

public class ProxyTest {
    public static void main(String[] args) {
        User user = new User();
        user.setAge(180);
        user.setName("非鸽传书");
        user.setSex("跪星人");
        user.setPassword("点赞、关注、评论,求求你啦");

        // ------ JDK 代理
        UserService userService = new UserServiceImpl();
        UserService proxy =
                (UserService)Proxy.newProxyInstance(
                        userService.getClass().getClassLoader(),
                        userService.getClass().getInterfaces(),
                        new JDKUserInvocationHandler(userService)
                );
        proxy.printUser(user);
        System.out.println("---------------------------------");

        // ----- cglib 代理
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserServiceImpl.class);
        enhancer.setCallback(new CglibMethodIntercepter());
        UserService us = (UserServiceImpl) enhancer.create();
        us.printUser(user);
    }
}

// 输出结果
jdk: 你这个人有点长寿啊
User{name='非鸽传书', age=180, sex='外星人', password='点赞、关注、评论,求求你啦'}
----------  jdk调用方法后  ----------
---------------------------------
cglib: 疯狂暗示
User{name='非鸽传书', age=180, sex='外星人', password='点赞、关注、评论,求求你啦'}
----------  cglib调用方法后  ----------

Cglib和jdk动态代理的区别


封面图,侵权删

动态代理有哪些实现方式,有什么区别

动态代理有哪些实现方式,有什么区别

动态代理有哪些实现方式,有什么区别

动态代理有哪些实现方式,有什么区别

展开阅读全文

页面更新:2024-05-17

标签:长寿   都会   动态   子类   外星人   字节   反射   暗示   实例   接口   对象   疯狂   方式   文件   方法   技术   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top