基于jdk动态代理和cglib动态代理实现及区别说明

 更新时间:2023年05月06日 08:38:29   作者:yujiubo2008  
这篇文章主要介绍了基于jdk动态代理和cglib动态代理实现及区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

jdk动态代理和cglib动态代理实现及区别

代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

代理模式又分为:

  • 静态代理
  • jdk动态代理
  • cglib动态代理
  • 由于静态代理会产生过多的代理类,一旦接口增加方法,目标对象与代理对象都要进行修改,不易维护。
  • 而动态代理是动态地在内存中构建代理对象,从而实现对目标对象的代理功能,接口增加方法时代理对象不受影响 。

下面我们讲讲jdk动态代理和cglib动态代理实现及区别

jdk动态代理实现

@Test
public void test(){
    IPerson target = new ManPerson();
    IPerson proxy = (IPerson)Proxy.newProxyInstance(
        target.getClass().getClassLoader(), 
        target.getClass().getInterfaces(), 
        new PersonInvocationHandler(target));
    proxy.eat();
    proxy.sleep();
}
// 代理对象
class PersonInvocationHandler implements InvocationHandler{
    private Object target;
    public PersonInvocationHandler(Object target){
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
        System.out.println("start");
    Object result = method.invoke(target, args);
    System.out.println("end");
    return result;
    }
}
// 目标对象
class ManPerson implements IPerson{
    @Override
    public void eat(){
    System.out.println("吃饭中......");
    }
    @Override
    public void sleep(){
    System.out.println("睡觉中......");
    }
}
// 目标对象接口
interface IPerson{
    void eat();
    void sleep();
}

cglib动态代理

@Test
public void test(){
    Person proxy = (Person)Enhancer.create(Person.class, new PersonMethodInterceptor());
    proxy.eat();
    proxy.sleep();
}
// 代理对象
class PersonMethodInterceptor implements MethodInterceptor{
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable{
        System.out.println("start");
    Object result = methodProxy.invokeSuper(o, objects);
    System.out.println("end");
    return result;
    }
}

目标对象

public class Person{
    public void eat(){
    System.out.println("吃饭中......");
    }
    public void sleep(){
    System.out.println("睡觉中......");
    }
}

区别

1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。

2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。

3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring @Bean注解的使用场景与案例实现

    Spring @Bean注解的使用场景与案例实现

    随着SpringBoot的流行,我们现在更多采用基于注解式的配置从而替换掉了基于XML的配置,所以本篇文章我们主要探讨基于注解的@Bean以及和其他注解的使用
    2023-03-03
  • 基于JavaScript动态规划编写一个益智小游戏

    基于JavaScript动态规划编写一个益智小游戏

    最近在学习动态规划相关的知识,所以本文将利用动态规划编写一个简单的益智小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06
  • 关于java中基本数据类型的数值范围

    关于java中基本数据类型的数值范围

    这篇文章主要介绍了关于java中基本数据类型的数值范围,基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型,它们是我们编程中使用最频繁的类型,需要的朋友可以参考下
    2023-07-07
  • SpringBoot动态修改yml配置文件的方法详解

    SpringBoot动态修改yml配置文件的方法详解

    这篇文章主要为大家详细介绍了SpringBoot动态修改yml配置文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 详解Java数据库连接JDBC基础知识(操作数据库:增删改查)

    详解Java数据库连接JDBC基础知识(操作数据库:增删改查)

    这篇文章主要介绍了详解Java数据库连接JDBC基础知识(操作数据库:增删改查),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Spring Boot 搭建 ELK正确看日志的配置流程

    Spring Boot 搭建 ELK正确看日志的配置流程

    这篇文章主要介绍了Spring Boot 搭建 ELK正确看日志的配置流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 如何解决Java多线程死锁问题

    如何解决Java多线程死锁问题

    死锁是一个很严重的、必须要引起重视的问题,本文主要介绍了死锁的定义,解决方法和面试会遇到的问题,感兴趣的可以了解一下
    2021-05-05
  • Security 登录认证流程详细分析详解

    Security 登录认证流程详细分析详解

    本文Security登录认证流程详细分析详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • RestFul风格 — 使用@PathVariable传递参数报错404的解决

    RestFul风格 — 使用@PathVariable传递参数报错404的解决

    这篇文章主要介绍了RestFul风格 — 使用@PathVariable传递参数报错404的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 详解如何热更新线上的Java服务器代码

    详解如何热更新线上的Java服务器代码

    这篇文章主要介绍了详解如何热更新线上的Java服务器代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论