基于jdk * 和cglib * 实现及区别说明

作者:yujiubo2008 时间:2022-04-11 00:32:44 

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执行效率更高。

来源:https://blog.csdn.net/yujiubo2008/article/details/123137340

标签:jdk, , ,cglib
0
投稿

猜你喜欢

  • Spring Boot 利用 XML 方式整合 MyBatis

    2023-02-09 23:01:18
  • javaweb Servlet开发总结(二)

    2023-10-31 11:51:48
  • C# 爬虫简单教程

    2022-04-24 14:10:53
  • Spring源码解析之编程式事务

    2023-06-20 19:17:49
  • java在网页上面抓取邮件地址的方法

    2023-10-01 19:18:21
  • SpringBoot文件分片上传的示例代码

    2023-06-18 11:30:15
  • Java Scala实现数据库增删查改操作详解

    2022-02-03 05:09:22
  • Spring Boot2发布调用REST服务实现方法

    2023-12-10 20:03:49
  • Java之如何关闭流

    2023-11-04 21:29:11
  • 浅谈java中Math.random()与java.util.random()的区别

    2023-11-26 16:37:16
  • Java 继承与多态的深入理解

    2023-10-05 04:25:41
  • 说说@ModelAttribute在父类和子类中的执行顺序

    2022-07-31 17:59:55
  • 浅析Java内存模型与垃圾回收

    2023-11-23 06:11:58
  • springboot+log4j.yml配置日志文件的方法

    2023-08-07 11:33:17
  • SpringBoot Profile多环境配置方式

    2023-12-14 01:44:24
  • SpringIOC框架的简单实现步骤

    2021-10-28 21:44:35
  • 关于MyBaties的基本配置标签总结

    2022-08-09 17:28:44
  • 浅谈Java中Int、Integer、Integer.valueOf()、new Integer()之间的区别

    2023-10-29 20:08:53
  • springmvc限流拦截器的示例代码

    2021-09-08 02:50:55
  • spring多数据源配置实现方法实例分析

    2023-06-06 22:15:56
  • asp之家 软件编程 m.aspxhome.com