Java编写objectCloner工具类实现clone方法克隆对象
时间: 2024-09-13 07:18:20 浏览: 67
在Java中,如果你想要实现一个`ObjectCloner`工具类来克隆对象,通常我们会创建一个类,它包含一个静态方法`deepClone()`,这个方法会使用序列化和反序列化的方式来实现对象的深复制。这是因为Java语言本身并不支持所有类型的克隆,尤其是对于不可序列化的对象。
以下是一个简单的`ObjectCloner`工具类的例子:
```java
import java.io.Serializable;
import java.lang.reflect.Field;
public class ObjectCloner<T> {
private static final ThreadLocal SerializationContext = new ThreadLocal<>();
public static T deepClone(T obj) throws CloneNotSupportedException {
if (obj == null) {
return null;
}
try {
// 将当前线程的上下文添加到序列化环境中
SerializationContext.set(obj);
// 使用序列化和反序列化来克隆对象
byte[] serializedBytes = serialize(obj);
Class<?> clazz = obj.getClass();
T clonedObj = (T) clazz.getConstructor().newInstance();
deserialize(clonedObj, serializedBytes);
return clonedObj;
} finally {
// 清除线程上下文
SerializationContext.remove();
}
}
private static void serialize(Object obj) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.close();
return byteArrayOutputStream.toByteArray();
}
private static void deserialize(Object obj, byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
objectInputStream.readFields();
objectInputStream.close();
}
// 针对Serializable对象,如果直接调用obj.clone()会抛异常,可以加上这个判断
private static boolean isSerializable(Class<?> clazz) {
return Serializable.class.isAssignableFrom(clazz);
}
}
```
当你需要克隆一个对象时,只需要传入你想克隆的对象实例,如:
```java
YourClass original = ...; // 创建一个实例
YourClass cloned = ObjectCloner.deepClone(original);
```
阅读全文