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中解决跨域问题的方法汇总(建议收藏)

    Java中解决跨域问题的方法汇总(建议收藏)

    我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果,下面给大家介绍Java中解决跨域问题的方法汇总,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • JAVA代码调用ffmpeg程序进行视频转码和推流方式

    JAVA代码调用ffmpeg程序进行视频转码和推流方式

    本文介绍了如何通过Java代码调用FFmpeg进行多媒体视频处理,包括两种方式:使用第三方封装的jar包和使用ProcessBuilder类创建进程,两种方式各有优缺点,选择时需根据具体需求和场景
    2025-02-02
  • Java JVM中线程状态详解

    Java JVM中线程状态详解

    这篇文章主要介绍了Java JVM中线程状态详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考一下
    2022-09-09
  • Maven项目启动报错error in opening zip file的解决方案

    Maven项目启动报错error in opening zip file的解决方

    这篇文章主要介绍了Maven项目启动时常见的`errorinopeningzipfile`错误,分析了其根本原因在于JAR文件损坏,文章提供了多种解决方法,包括删除损坏的JAR文件、清理本地仓库、检查磁盘错误、手动下载等,需要的朋友可以参考下
    2025-10-10
  • Java设计模式之解释器模式(Interpreter模式)介绍

    Java设计模式之解释器模式(Interpreter模式)介绍

    这篇文章主要介绍了Java设计模式之解释器模式(Interpreter模式)介绍,Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子,需要的朋友可以参考下
    2015-03-03
  • 详解Java数字签名提供XML安全

    详解Java数字签名提供XML安全

    在本篇文章中我们给大家整理了关于Java数字签名提供XML安全的知识点内容,有需要的朋友们可以学习下。
    2018-08-08
  • 教你怎么用java实现客户端与服务器一问一答

    教你怎么用java实现客户端与服务器一问一答

    这篇文章主要介绍了教你怎么用java实现客户端与服务器一问一答,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 利用枚举法求直方图中最大矩形面积的方法实例

    利用枚举法求直方图中最大矩形面积的方法实例

    今天小编就为大家分享一篇关于利用枚举法求直方图中最大矩形面积的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Java ClassCastException报错:java.util.HashSet cannot be cast to java.util.List的解决方法

    Java ClassCastException报错:java.util.HashSet cannot

    这篇文章主要来带大家分析一下Java开发中常见的ClassCastException异常,当试图将HashSet强制转换为List时会抛出java.util.HashSet cannot be cast to java.util.List,下面我们来看看具体怎么解决吧
    2026-02-02
  • 解析Linux系统中JVM内存2GB上限的详解

    解析Linux系统中JVM内存2GB上限的详解

    本篇文章是对Linux系统中JVM内存2GB上限进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论