JAVA数据处理的常用技术 - 编程一生

JAVA数据处理的常用技术 - 编程一生

💡 原文中文,约1300字,阅读约需4分钟。
📝

内容提要

文章介绍Java数据处理常用技术:序列化与反序列化,传输常用JSON,存储用protostuff等编码;反射可在运行时获取和调用类的属性方法,广泛用于Spring及业务开发;动态代理用于AOP,JDK代理需接口,cglib靠继承,Spring优先JDK,无接口则用cglib,可用注解强制。作者强调查找排序是搜索、大数据和AI的基础,应苦练基本功。

🔎

延伸解读

序列化选择:传输与存储的权衡

文章指出,传输序列化因涉及第三方通信,需兼顾安全、可读性和不变性,常用JSON;存储链路短且可控,更重效率,常用protostuff等编码方案。但编码方案需双方约定映射关系,若映射表变更未同步,如3原代表four后改为three,会导致解析错误。这提醒开发者,在跨系统通信中,可读性有时比效率更重要,而存储场景则可优先考虑空间和速度。

反射:框架与业务中的动态能力

反射允许运行时获取类的属性和方法并调用,是Spring的RequestParam、RequestBody、ResponseBody以及Jackson等工具的基础。文章以AI助手问答机为例,展示如何通过反射动态获取对象属性,如field.get(冰冰)返回年龄。这种能力在业务代码中也很常见,但需注意反射会绕过编译期检查,可能带来性能开销和安全风险,应谨慎使用。

动态代理:Spring AOP的底层机制

Spring AOP基于动态代理,底层依赖反射。JDK动态代理要求目标类实现接口,cglib则通过继承生成子类,无法代理final类。Spring默认优先使用JDK代理,无接口时用cglib。若多个类实现同一接口且被Spring管理,可能抛出代理异常,此时可用@EnableAspectJAutoProxy(proxyTargetClass = true)强制使用cglib。理解这些差异有助于排查代理相关问题。

基本功:查找排序是技术基石

作者强调,查找和排序算法是搜索技术的核心,而大数据建立在搜索技术之上,AI又建立在大数据之上。因此,这些看似基础的算法实则支撑着高深技术。文章提醒开发者不要忽视基本功,苦练查找排序等底层能力,才能更好地理解和应用上层技术。这一观点对当前热衷AI的开发者尤其具有反思价值。

❓

Q&A

Java中序列化和反序列化分别是什么?

序列化是将对象的信息转换为可传输或可存储形式的过程;反序列化则是将这些可传输或可存储的信息变回对象。

传输和存储场景下常用的序列化技术有什么不同?

传输场景因为涉及第三方通信,注重可读性和不变性,最常用JSON这种人类可读的序列化手段;存储场景链路短、可控,更讲究效率,会使用protostuff这种将key映射成编码来传输的方式,因为编码更省空间更高效。

Java反射机制是什么?有哪些常见应用?

Java反射是在运行时,对于任何一个类,都可以知道这个类有哪些方法和属性;对于任何一个对象,都能对它的方法和属性进行调用。常见应用包括Spring的RequestParam、RequestBody、ResponseBody内部使用了反射机制,Jackson等工具类,以及在业务代码中直接使用反射,例如实现AI助手问答机时通过反射获取字段值。

JDK动态代理和cglib动态代理有什么区别?

JDK动态代理只能给有接口的类代理,本质是通过反射获取要执行的方法,并在执行前后加入代理处理操作;cglib本质上用继承的方法实现,通过动态生成一个子类去覆盖所要代理的类,用final修饰的不能被覆盖的就不代理了。

Spring动态代理是如何选择JDK和cglib的?遇到代理异常怎么解决?

Spring动态代理优先使用JDK动态代理,如果目标没有实现任何接口,则创建一个cglib代理。如果几个类实现了同一个通用接口(如Runnable)并加了@Component请Spring负责其生命周期,会抛出Proxy代理异常,提示期望加载一个Bean但实际实现不只一个。此时可以在类上加@EnableAspectJAutoProxy(proxyTargetClass = true)标签强制使用cglib代理来解决。

为什么说查找和排序是搜索、大数据和AI的基础?

查找和排序算法一直被奉为经典,而这两项就是搜索技术的核心。大数据是建立在搜索技术基础上的,AI又是建立在大数据基础上的。因此查找和排序的核心地位可见一斑,看似高深的技术也是从最底层开始,需要苦练基本功。

🏷️

标签

➡️

继续阅读