import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.UUID;

/**
 * 在上述示例中,`SerializeOnFinalize`类重写了`finalize()`方法,在方法中将对象序列化到文件`serializedObject.ser`中。
 * 在`main()`方法中,我们创建了一个`SerializeOnFinalize`对象,然后将其置为`null`,使其成为垃圾回收的候选对象。
 * 最后,我们手动调用`System.gc()`方法触发垃圾回收。
 * <p>
 * 当垃圾回收器执行完毕时,`finalize()`方法会被调用,对象的内容将被序列化到文件中。
 * 请注意,垃圾回收的执行时间是不确定的,因此无法保证`finalize()`方法会立即执行。
 * @author Percy
 * @date 2023/11/6
 */
public class SerializeOnFinalize implements Serializable {
    private String data;

    public SerializeOnFinalize(String data) {
        this.data = data;
    }

    @Override
    protected void finalize() throws Throwable {
        try {
            // 将对象序列化到文件中
            try (FileOutputStream fileOut = new FileOutputStream("serializedObject.ser")) {
                ObjectOutputStream out = new ObjectOutputStream(fileOut);
                out.writeObject(this);
                out.close();
            }
            System.out.println("对象已序列化到文件中");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            super.finalize();
        }
    }

    public static void main(String[] args) {
        SerializeOnFinalize obj = new SerializeOnFinalize("Hello World");

        // 将对象置为null,使其成为垃圾回收的候选对象
        obj = null;

        // 手动进行垃圾回收
        System.gc();

        System.out.println(UUID.randomUUID());
    }
}

标签: none

添加新评论