minglipro 09792e2c3b
All checks were successful
Gitea Actions Build / Build (push) Successful in 53s
no message
2025-09-10 20:58:17 +08:00

81 lines
2.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright 2025 mingliqiye
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ProjectName mingli-utils
* ModuleName mingli-utils.main
* CurrentFile CloneUtil.java
* LastUpdate 2025-09-09 09:32:17
* UpdateUser MingLiPro
*/
package com.mingliqiye.utils.clone;
import com.mingliqiye.utils.json.JsonApi;
import com.mingliqiye.utils.json.JsonException;
import java.io.*;
public class CloneUtil {
/**
* 对指定的可序列化对象进行深拷贝
*
* @param object 需要进行深拷贝的对象必须实现Serializable接口
* @param <T> 对象的类型必须实现Serializable接口
* @return 深拷贝后的新对象,与原对象内容相同但内存地址不同
* @throws RuntimeException 当序列化或反序列化过程中发生IO异常或类未找到异常时抛出
*/
public static <T extends Serializable> T deepClone(T object) {
try {
ByteArrayOutputStream bao = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bao);
oos.writeObject(object);
ByteArrayInputStream bis = new ByteArrayInputStream(
bao.toByteArray()
);
ObjectInputStream ois = new ObjectInputStream(bis);
return (T) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
/**
* 深度克隆对象使用JSON序列化和反序列化实现
*
* @param <T> 对象类型参数
* @param object 需要克隆的对象实例
* @param jsonApi JSON序列化接口实现
* @return 克隆后的对象实例
*/
public static <T> T deepJsonClone(T object, JsonApi jsonApi) {
if (object == null) {
return null;
}
if (jsonApi == null) {
throw new IllegalArgumentException("jsonApi cannot be null");
}
try {
return (T) jsonApi.convert(object, object.getClass());
} catch (Exception e) {
throw new JsonException(
"Failed to deep clone object using JSON",
e
);
}
}
}