java中jdk代理和cglib代理使用步骤详解

 更新时间:2023年11月30日 09:02:41   作者:山河亦问安  
这篇文章主要给大家介绍了关于java中jdk代理和cglib代理使用步骤的相关资料,JDK代理和CGLIB是Java中两种常见的代理实现方式,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在Java中,代理是一种设计模式,它允许一个对象(代理)控制对另一个对象(真实对象)的访问。Java中的代理主要分为两种类型:JDK(Java Dynamic Proxy)代理和CGLIB(Code Generation Library)代理。

JDK 代理

JDK 代理是 Java 动态代理的一种实现方式,它是通过 Java 反射机制来实现的。JDK 代理要求被代理的类必须实现一个或多个接口,因为它是基于接口的代理。

使用步骤:

定义接口: 定义一个接口,它是被代理类和代理类都要实现的接口。

public interface MyInterface {
    void doSomething();
}

实现真实对象类: 实现接口的真实对象类。

public class RealObject implements MyInterface {
    public void doSomething() {
        System.out.println("RealObject is doing something.");
    }
}

创建代理对象: 使用 Proxy.newProxyInstance() 方法创建代理对象。

RealObject realObject=new RealObject();

        MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance(RealObject.class.getClassLoader(), RealObject.class.getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("Before invoking method.");
                Object result = method.invoke(realObject, args);
                System.out.println("After invoking method.");
                return result;
            }
        });
        proxyInstance.doSomething();

CGLIB 代理

CGLIB 代理是通过生成被代理类的子类来实现的,因此不要求被代理类实现接口,它可以代理没有无参构造函数的类。

创建代理对象: 使用 Enhancer 类创建代理对象。

 RealObject realObject=new RealObject();
       //代理是子类型,目标是父类型
       RealObject proxy = (RealObject) Enhancer.create(RealObject.class, new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("Before invoking method.");
                Object result = methodProxy.invokeSuper(o, args);
//                Object invoke = methodProxy.invoke(realObject, args);
                System.out.println("After invoking method.");
                return result;
            }
        });

       proxy.doSomething();

附:JDK动态代理和CGLIB动态代理的区别

  • 实现方式不同:JDK动态代理是基于接口的动态代理,而CGLIB动态代理是基于继承的动态代理。
  • 代理对象类型不同:JDK动态代理代理的对象必须实现一个接口,生成的代理对象类型是接口类型;而CGLIB动态代理可以代理没有实现接口的类,生成的代理对象类型是目标对象的子类。
  • 性能不同:JDK动态代理使用Java原生的反射机制进行操作,因此在生成代理对象时会消耗一定的时间,但在执行方法时,因为是接口代理,所以调用速度相对较快;而CGLIB动态代理使用ASM框架生成字节码,因此在生成代理对象时比JDK动态代理更快,但在调用方法时,因为要通过继承来实现代理,所以调用速度相对较慢。
  • 引用的库不同:JDK动态代理不需要引用任何第三方库,因为它是Java自带的;而CGLIB动态代理需要引用cglib库和asm库。
  • 对象的限制不同:JDK动态代理只能代理实现了接口的类;而CGLIB动态代理可以代理没有实现接口的类。

总结 

到此这篇关于java中jdk代理和cglib代理使用步骤的文章就介绍到这了,更多相关java jdk代理和cglib代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java读取html文件,并获取body中所有的标签及内容的案例

    java读取html文件,并获取body中所有的标签及内容的案例

    这篇文章主要介绍了java读取html文件,并获取body中所有的标签及内容的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • springboot利用aspose预览office文件的实现过程

    springboot利用aspose预览office文件的实现过程

    这篇文章主要给大家介绍了关于springboot利用aspose预览office文件的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考价值,需要的朋友可以参考下
    2021-06-06
  • Eclipse转Itellij IDEA导入Git/svn本地项目的详细步骤

    Eclipse转Itellij IDEA导入Git/svn本地项目的详细步骤

    这篇文章主要介绍了Eclipse转Itellij IDEA导入Git/svn本地项目,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 解决SpringBoot web项目启动后立即关闭的问题

    解决SpringBoot web项目启动后立即关闭的问题

    这篇文章主要介绍了解决SpringBoot web项目启动后立即关闭的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot项目集成MinIO全过程

    SpringBoot项目集成MinIO全过程

    这篇文章主要介绍了SpringBoot项目集成MinIO全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringBoot Controller中的常用注解

    SpringBoot Controller中的常用注解

    这篇文章主要介绍了SpringBoot Controller中的常用注解,文章围绕主题展开详细的内容介绍,具有有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 详解Spring Boot中@PostConstruct的使用示例代码

    详解Spring Boot中@PostConstruct的使用示例代码

    在Java中,@PostConstruct是一个注解,通常用于标记一个方法,它表示该方法在类实例化之后(通过构造函数创建对象之后)立即执行,这篇文章主要介绍了详解Spring Boot中@PostConstruct的使用,需要的朋友可以参考下
    2023-09-09
  • servlet简单实现文件下载的方法

    servlet简单实现文件下载的方法

    这篇文章主要介绍了servlet简单实现文件下载的方法,涉及基于servlet技术实现流形式文件传输的相关操作技巧,需要的朋友可以参考下
    2016-12-12
  • Redis框架Jedis及Redisson对比解析

    Redis框架Jedis及Redisson对比解析

    这篇文章主要介绍了Redis框架Jedis及Redisson对比解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 深入探讨Java 中的 Object 类详解(一切类的根基)

    深入探讨Java 中的 Object 类详解(一切类的根基)

    本文详细介绍了Java中的Object类,作为所有类的根类,其重要性不言而喻,文章涵盖了Object类的主要方法,如toString()、equals()、hashCode()等,本文深入探讨 Object 类的作用、常用方法以及如何在实际开发中利用这些方法,感兴趣的朋友一起看看吧
    2025-01-01

最新评论