Да, поскольку метод clone () защищен , он может быть только унаследован, но его нельзя вызвать для объекта другого класса.
Каждый класс наследует Object, поэтому вы можете просто вызвать clone ().
Но в (по умолчанию / родном) методе clone () у вас есть if () {}, в котором, если ваш класс не реализует Cloneable, он выдаст исключение CloneNotSupportedException.
Я сказал нативный, потому что метод clone () является нативным, когда вы его вызываете,
вызвал другой метод, написанный в C ++.
Вот небольшая часть кода, которая вызывается при вызове clone ().
if (!klass->is_cloneable()) {
ResourceMark rm(THREAD);
THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
}
спасибо Можно ли найти источник для нативного метода Java?
вы можете использовать рефлексию для вызова метода клонирования без переопределения его в вашем объекте.
public class Main{
public static void main(String[] args) throws CloneNotSupportedException {
A a = new A();
Object o = new Object();
Method method = null;
try {
method = o.getClass().getDeclaredMethod("clone");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
method.setAccessible(true);
try {
System.out.println(method.invoke(a));
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
class A implements Cloneable {
}
и method.invoke(a) instanceof A
оценивается как истинное
без реализации Cloneable вы получите
Caused by: java.lang.CloneNotSupportedException: defaultPackage.A
at java.lang.Object.clone(Native Method)
И поскольку Integer не реализует Cloneable, метод clone () будет генерировать исключение java.lang.CloneNotSupportedException.