背景
在实际开发中, 数据的处理有五种: 获取, 传输, 存储, 分析, 转换. 每种各对应一些常用的技术.
序列化和反序列化
序列化是将对象的信息转换为可传输或可存储形式的过程. 反序列化就是反过来让这些可传输的, 可存储的信息变回对象.
传输的序列化除了安全性的考虑, 因为涉及到和第三方通信, 所以还有重要的一点是可读性和不变性. 而存储的链路短, 可控, 所以更讲究效率.
传输最常用的序列化手段是 JSON 这样人眼可读的. 而存储会使用 protostuff 这种将 key 值映射成编码来传输的. 因为 1,2,3 比 one,two,four 更省空间更高效. 但是传输中都用编码, 解析时就很难判断它的意义. 双方还要进行额外的约定. 本来 3 代表 four, 中间加了一个 three,3 代表 three 的话, 对方没有及时被通知, 那么解析传输过来的消息就是错的.
反射
Java 反射是在运行时, 对于任何一个类, 都可以知道这个类有哪些方法和属性. 对于任何一个对象, 都能对它的方法和属性进行调用.
常用数据转换工具, 比如 Spring 的 RequestParam,RequestBody,ResponseBody 内部就用了反射机制. 还有 Jackson 等工具类. 甚至在业务代码中直接使用反射也是很常见的. 比如设计一个 AI 助手问答机. 想实现:
小 A: 我要搜索美女 "冰冰"AI 助手: OK, 搜索 "冰冰" 小 A: 想知道她的 "年龄"AI 助手: 21 岁
上面这个 JAVA 实现是这样的:
Field field = 美女. class.getDeclaredField(年龄);field.setAccessible(true);return field.get(冰冰).toString();
动态代理
代理模式是为了提供增强的或不同的操作, 而插入来替代实际对象的对象. 这些操作涉及到与实际对象的通信, 所以称为代理.
Spring 主要的两大思想 IoC 和 AOP. 对于 IoC, 利用的是反射机制. 而 AOP 使用了动态代理, 当然底层也是反射.
JDK 动态代理只能给有接口的类代理. 本质是通过反射获取要执行的方法, 并在执行前或者后加入一些代理处理操作. cglib 本质上用继承的方法实现的, 是通过动态生成一个子类去覆盖所要代理的类. 用 final 修饰的不能被覆盖的就不代理了. spring 动态代理是优先使用 JDK 动态代理, 如果目标没有实现任何接口, 则创建一个 cglib 代理. 如果几个类实现了都实现了一个通用接口, 比如 Runnable, 并且加了 Component 请 spring 来负责其生命周期. 这时候会抛出一个 Proxy 代理异常. 说期望加载一个 Bean, 实际上实现却不只一个. 这时候可以在这个类上加下面标签强制使用 cglib 代理来解决.
@EnableAspectJAutoProxy(proxyTargetClass = true)
总结
我工作十几年来, 查找和排序算法一直被奉为经典. 而这两项就是搜索技术的核心. 大数据是建立在搜索技术基础上的. AI 又是建立在大数据基础上的. 可见查找和排序的核心地位. 看似高深的技术也是从最底层开始. 苦练基本功.
来源: https://www.cnblogs.com/xiexj/p/11580117.html