通过反射创建对象:通过 Java 的反射机制可以在运行时动态地创建对象。可以使用 Class 类的 newInstance() 方法或者通过 Constructor 类来创建对象
public class MyClass {
public MyClass() {
// Constructor
}
}
public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = MyClass.class;
MyClass obj = (MyClass) clazz.newInstance();
}
}
通过反序列化创建对象:通过将对象序列化(保存到文件或网络传输)然后再反序列化(从文件或网络传输中读取对象)的方式来创建对象,对象能被序列化和反序列化的前提是类实现Serializable接口。
import java.io.*;public class MyClass implements Serializable {// Class definition
}public class Main {public static void main(String[] args) throws Exception {// Serialize objectMyClass obj = new MyClass();ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.ser"));out.writeObject(obj);out.close();// Deserialize objectObjectInputStream in = new ObjectInputStream(new FileInputStream("object.ser"));MyClass newObj = (MyClass) in.readObject();in.close();}
}
将对象转为二进制字节流具体怎么实现?
其实,像序列化和反序列化,无论这些可逆操作是什么机制,都会有对应的处理和解析协议,例如加密和解密,TCP的粘包和拆包,序列化机制是通过序列化协议来进行处理的,和 class 文件类似,它其实是定义了序列化后的字节流格式,然后对此格式进行操作,生成符合格式的字节流或者将字节流解析成对象。
在Java中通过序列化对象流来完成序列化和反序列化:
-
ObjectOutputStream:通过writeObject()方法做序列化操作。
-
ObjectInputStrean:通过readObject()方法做反序列化操作。
只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常!