Java基础知识

112 阅读5分钟

1. 序列化和反序列化

序列化和反序列化是计算机编程中用于处理对象状态转化的过程,它们分别对应数据结构或对象状态到字节流的转换以及字节流恢复为原数据结构或对象状态的过程。

序列化(Serialization) : 序列化是指将一个数据结构或对象(包括其属性和嵌套的对象)的状态信息转换成一种可以存储(如写入磁盘文件、数据库或缓存)或传输(如网络通信)的格式,通常是字节序列。这个过程通常包括以下步骤:

  • 将对象的各个属性值(包括基本类型、复杂类型如数组、集合、自定义对象等)提取出来。
  • 按照特定的序列化协议(如JSON、XML、二进制格式如Java的序列化API、protobuf等)将这些属性值编码为字节流。
  • 附加必要的元数据或头部信息(如类名、版本信息、序列化ID等),以便反序列化时正确解析和还原对象。

序列化的主要目的包括:

  • 持久化:将对象状态保存到磁盘,以便程序重启后能恢复对象状态。
  • 通信:在网络传输中发送或接收对象状态,实现不同系统间的数据交换。
  • 缓存:将对象状态存入内存缓存或分布式缓存,提高数据访问速度。

反序列化(Deserialization) : 反序列化是序列化过程的逆操作,它将之前序列化产生的字节流还原为原始的数据结构或对象状态。反序列化过程包括:

  • 从字节流中读取元数据或头部信息,识别序列化的对象类型和结构。
  • 按照序列化协议解析字节流,将其中编码的属性值解码为原始数据类型。
  • 根据对象结构,利用解码后的属性值重新构建对象实例,并将其属性设置为相应的值。

反序列化的目的是:

  • 恢复对象:从持久化存储中读取字节流,重建对象实例,恢复程序运行时的状态。
  • 接收数据:在网络通信中接收到字节流,将其解析为本地可以处理的对象,供应用程序进一步处理。
  • 获取缓存数据:从缓存中读取字节流,还原为可用的对象,避免重新计算或查询。

2. Java反射机制

Java反射机制是Java语言提供的一种在运行时动态获取和操作类、对象、属性、方法等程序元素的能力。通过反射,程序可以在不知道具体类名或对象类型的情况下,于运行时动态地创建对象、访问和修改对象的私有属性、调用对象的方法、获取类的构造函数、字段、方法信息等。以下是Java反射机制的简要概述:

核心概念与功能

  1. Class对象:每个Java类在加载后都有一个对应的java.lang.Class对象,它是反射操作的入口点。通过Class对象,可以获取类的全名、父类、接口、注解、修饰符等元信息,以及创建类的实例、访问类的成员等。
  2. 对象 introspection:反射允许程序检查任意对象的类型,获取其实际运行时的Class对象,进而了解对象所属的类及其所有属性和方法。
  3. 动态创建对象:通过Class对象的newInstance()方法或其他构造器反射API,可以在运行时动态创建类的实例,即使这个类在编译时是未知的。
  4. 访问和修改对象属性:反射可以获取类的所有字段(包括私有字段),并允许读取和修改对象实例的字段值,即使这些字段是私有的或受保护的。
  5. 方法调用:反射可以获取类的所有方法,并允许在运行时动态调用对象的方法,包括私有方法和带特定参数的方法。可以指定方法的参数值,并获取方法的返回值。
  6. 构造函数操作:反射可以获取类的所有构造函数,并允许在运行时通过构造函数反射API创建对象实例,可以选择特定参数类型的构造函数。
  7. 获取泛型信息与类型参数:反射支持获取类、接口、方法、字段上的泛型类型参数信息,这对于运行时进行类型安全的检查和操作泛型类型非常有用。
  8. 注解处理:反射可以获取类、方法、字段上的注解,并通过反射API读取注解的属性值,支持在运行时基于注解信息做出决策或执行特定逻辑。

应用场景

  • 框架与库:如Spring框架利用反射实现依赖注入、AOP(面向切面编程)以及对象的动态代理;ORM(对象关系映射)库如Hibernate利用反射处理对象与数据库表的映射。
  • 动态加载与插件系统:在运行时根据配置或用户需求加载未知类并创建对象,实现插件化架构。
  • 通用工具与库:如JSON序列化/反序列化库,通过反射处理任意类型的对象与JSON字符串之间的转换。