一般说来,Java的对象必须要实现Cloneable接口才能克隆,如果是自定义的类,只需实现Cloneable接口并在clone()中调用super.clone()即可,但如果是系统提供的类,则无法这样进行克隆。那么对这样的对象有没有方法进行clone呢?
先看一下Object类中clone()部分
protected Object clone() throws CloneNotSupportedException {
if (!(this instanceof Cloneable)) {
throw new CloneNotSupportedException("Class " + getClass().getName() +
" doesn't implement Cloneable");
}
return internalClone();
}
这里面调用的是internalClone(),
private native Object internalClone();
是private修饰的,所以想到用反射来调用:
public static <T> T clone(T o) {
try {
Method method = Object.class.getDeclaredMethod("internalClone");
method.setAccessible(true);
Object copy = method.invoke(o);
return (T) copy;
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return o;
}
这样只要把要克隆的对象作为参数传进来,返回值就是克隆的结果,亲测可用