zoukankan      html  css  js  c++  java
  • JAVA数据处理的常用技术

    背景

    在实际开发中,数据的处理有五种:获取、传输、存储、分析、转换。每种各对应一些常用的技术。

    序列化和反序列化

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

    传输的序列化除了安全性的考虑,因为涉及到和第三方通信,所以还有重要的一点是可读性和不变性。而存储的链路短,可控,所以更讲究效率。

    传输最常用的序列化手段是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又是建立在大数据基础上的。可见查找和排序的核心地位。看似高深的技术也是从最底层开始。苦练基本功。

  • 相关阅读:
    常用类练习题(用字符串常用类判断输入的一段话是否为回文)
    面向对象综合练习题(动物乐园)
    多态练习题(通过UML建模语言来实现饲养员喂养动物)
    UML建模语言使用的概述
    多态练习题(员工使用不同的交通工具回家)
    多态练习题(宠物医院治疗小动物的问题 ,多态的应用:向上类型传递)
    接口练习题(书信接口)
    接口练习题(实现接口功能拓展的两种方法)
    Oracle rman 各种恢复
    Oracle rman 全备份的一个小例子
  • 原文地址:https://www.cnblogs.com/xiexj/p/11580117.html
Copyright © 2011-2022 走看看