首页 > 其他分享 >JDK和CGLIB动态代理技术的适用场景和特点

JDK和CGLIB动态代理技术的适用场景和特点

时间:2024-10-30 18:41:42浏览次数:1  
标签:场景 JDK 代理 接口 proxy CGLIB 动态 public

区别

项目JDK 动态代理CGLIB 动态代理
代理原理 基于接口 (Interface) 基于字节码生成 (Subclassing)
实现方式 使用 java.lang.reflect.Proxy 类 使用 net.sf.cglib.proxy.Enhancer 类
被代理类要求 必须实现一个或多个接口 可以代理没有实现接口的类,可以是普通类
性能 由于通过反射调用接口方法,性能稍差 通过生成子类并调用父类方法,性能较好
代理类生成方式 在运行时动态生成代理类 在运行时通过生成子类并字节码增强
方法调用的灵活性 只代理接口中的方法 可代理类中的所有方法,包括私有方法,但不能代理 final 方法
侵入性 需要被代理类实现接口 不需要被代理类实现接口,非侵入式
使用复杂度 较低,JDK 自带,配置简单 较高,需要引入第三方库,可以配置较多的代理行为

适用场景

代理技术适用场景
JDK 动态代理 适用于需要代理实现了接口的类,且无需代理性能特别高的情况
CGLIB 动态代理 适用于需要代理没有实现接口的普通类,且需要较高的代理性能

 

示例代码

JDK 动态代理示例:

 1 // 定义接口
 2 interface SampleInterface {
 3     void test();
 4 }
 5 
 6 // 实现接口的原始类
 7 class SampleClass implements SampleInterface {
 8     @Override
 9     public void test() {
10         System.out.println("Hello World");
11     }
12 }
13 
14 // 自定义 InvocationHandler
15 class MyInvocationHandler implements InvocationHandler {
16     private final Object target;
17 
18     public MyInvocationHandler(Object target) {
19         this.target = target;
20     }
21 
22     @Override
23     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
24         System.out.println("Before method call");
25         Object result = method.invoke(target, args); 
26         System.out.println("After method call");
27         return result;
28     }
29 }
30 
31 public class JdkProxyExample {
32     public static void main(String[] args) {
33         SampleClass original = new SampleClass();
34 
35         SampleInterface proxyInstance = (SampleInterface) Proxy.newProxyInstance(
36                 original.getClass().getClassLoader(),
37                 original.getClass().getInterfaces(),
38                 new MyInvocationHandler(original)
39         );
40 
41         proxyInstance.test();
42     }
43 }
JDK 动态代理示例

CGLIB 动态代理示例:

 1 import net.sf.cglib.proxy.Enhancer;
 2 import net.sf.cglib.proxy.MethodInterceptor;
 3 import net.sf.cglib.proxy.MethodProxy;
 4 
 5 import java.lang.reflect.Method;
 6 
 7 class SampleClass {
 8     public void test() {
 9         System.out.println("Hello World");
10     }
11 }
12 
13 public class CglibExample {
14     public static void main(String[] args) {
15         Enhancer enhancer = new Enhancer();
16         enhancer.setSuperclass(SampleClass.class);
17 
18         enhancer.setCallback((MethodInterceptor) (obj, method, args1, proxy) -> {
19             System.out.println("Before method call");
20             Object result = proxy.invokeSuper(obj, args1); 
21             System.out.println("After method call");
22             return result;
23         });
24 
25         SampleClass proxy = (SampleClass) enhancer.create();
26         proxy.test();
27     }
28 }
CGLIB 动态代理示例

 

总结:选择哪种代理技术取决于具体的场景和需求。JDK 动态代理简单而直接,适用于接口代理;CGLIB 动态代理则功能强大,适用于需要高性能和类代理的场景

 

标签:场景,JDK,代理,接口,proxy,CGLIB,动态,public
From: https://www.cnblogs.com/auv2009/p/18516370

相关文章

  • 国标GB28181公网平台LiteGBS国标GB28181-2022平台应用场景探索
    在数字化时代迅猛发展的今天,视频监控技术已成为多个行业安全管理体系中的关键一环。国标GB28181公网平台LiteGBS以其出色的性能和多样化的应用范围,在提高公共服务水平和促进基层治理方式创新等方面扮演着至关重要的角色。本文将详细讨论LiteGBS在各个领域的应用情况,展示其强大的功......
  • JDK新特性--Stream流
    目录解释什么是Stream流以及它在Java中的作用?Stream流的概念Stream流的作用Stream流的使用示例注意事项描述StreamAPl中的中间操作和终端操作的区别?中间操作(IntermediateOperations)终端操作(TerminalOperations)解释并行流的概念及其优势?使用并行流时需要注意的事项:解释Stream......
  • Spring Security 4大核心架构图与21种安全验证策略场景分析(高级篇)
    SpringSecurity是一个功能强大且高度可定制的Java安全框架,用于保护基于Spring的应用程序。它提供全面的安全服务,包括认证、授权、防止CSRF攻击、会话管理等。通过灵活的配置选项和多种认证机制,SpringSecurity帮助开发者构建安全、健壮的应用系统,支持从简单的表单......
  • 明火识别检测视频分析服务器烟雾检测识别在企业消防安防场景中的应用
    随着科技的不断进步,明火识别检测视频分析服务器在企业消防安防领域扮演着越来越重要的角色。它通过结合人工智能、大数据分析和物联网技术,为火灾预防、检测和响应提供了全新的解决方案。以下是在企业消防安防场景中的一些关键应用,它们展示了如何利用这些先进技术来提升消防安全管......
  • 基于alpine制作jdk8基础镜像/解决时区问题
    在一次使用镜像部署项目中,发现推送的消息时间不是预设的,检查后发现是基础镜像时区不对导致。下面是自己制作基础镜像的简单记录,可参考制作更好的基础镜像,以支持快速部署。 1、拉取alpinedockerpull openjdk:8-jdk-alpine2、创建Dockerfile文件FROMopenjdk:8-jdk-alpine......
  • 双11场景下的精准营销难题,火山引擎数据飞轮给出这份解答
    10月14日,阿里巴巴、拼多多、京东选择在同一天启动双11;而在更在之前,抖音、小红书已有动作——前者在国庆假期刚结束就开启“抖音商城双11好物节”,后者则在12日宣布启动“1年1读购物狂欢”。 今年,似乎将成为“史上最长双11”。 “战线”拉长了,但从预售期的表现来看,各大平台的......
  • 高性能 ArkUI 应用开发:复杂 UI 场景中的内存管理与 XML 优化
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在开发高性能ArkUI应用时,尤其是涉及......
  • EnhancerByCGLIB和EnhancerBySpringCGLIB代理
    $$EnhancerByCGLIB 和 $$EnhancerBySpringCGLIB 是由两个不同的库生成的Java字节码代理类的命名后缀。尽管两者都与CGLIB(CodeGenerationLibrary)有关,但它们有一些重要的区别。CGLIB代理简介CGLIB是一个开源的字节码生成库,允许在运行时动态创建类和对象。它最著名的用途......
  • 算法定制视频分析网关车辆违停在园区场景中的应用
    针对园区内车辆违停的监控挑战,算法定制视频分析网关能够与园区现有的监控体系无缝整合,利用人工智能技术对监控系统进行智能化升级,从而实现全天候自动监测车辆违停情况,有效解决了园区在车辆管理上的难题。通过在园区的禁止停车区、主要道路和停车场等关键位置安装监控摄像头,并将......
  • 大话Java系列-并发场景下HashMap的环形链表问题,jmap检查内存状态,jstack查看线程状态,线
    文章目录童话故事故事开始发现问题解决问题代码实现1.使用普通`HashMap`导致的环形链表问题2.使用`jmap-histo`检查内存状态3.使用`jstack`查看当前线程的状态4.分析结果`jmap-histo`输出示例`jstack`输出示例5.使用ConcurrentHashMap解决问题6.使用外部加锁保......