Java注解对象克隆
注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注,和 Javadoc 不同,Java 标注可以通过反射获取标注内容,在编译器生成类文件时,标注可以被嵌入到字节码中,Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。
当然它也支持自定义 Java 标注。
什么是注解
注解是java中的标注方式,可以作用在类,方法,变量,参数成员上
在编译期间,会被编译到字节码文件中,运行时通过反射机制获得注解内容,进行解析
内置注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
作用在其他注解的注解(元注解)
@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
@Documented - 标记这些注解是否包含在用户文档中。
@Target - 标记这个注解应该是哪种 Java 成员。
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
从 Java 7 开始,额外添加了 3 个注解:
@SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
定义注解
使用注解
解析注解
对象克隆
在Java中,对象克隆是一个很常见的操作,它允许你创建一个对象的副本。默认情况下,Java中的对象克隆是浅拷贝(shallow copy),这意味着如果对象中的任何字段是引用类型,那么这两个对象将会共享这些引用。
要克隆一个对象,首先需要实现 Cloneable 接口,然后重写 Object 类的 clone() 方法。下面是一个简单的例子来展示如何克隆一个对象:
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
try {
Person originalPerson = new Person("John", 30);
Person clonedPerson = (Person) originalPerson.clone();
System.out.println("Original: Name - " + originalPerson.getName() + ", Age - " + originalPerson.getAge());
System.out.println("Cloned: Name - " + clonedPerson.getName() + ", Age - " + clonedPerson.getAge());
// 修改原始对象的属性
originalPerson.setName("Doe");
originalPerson.setAge(31);
System.out.println("\nAfter modification:");
System.out.println("Original: Name - " + originalPerson.getName() + ", Age - " + originalPerson.getAge());
System.out.println("Cloned: Name - " + clonedPerson.getName() + ", Age - " + clonedPerson.getAge());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
浅克隆
克隆一个对象,只把关联对象的地址克隆了一下,并没有创建新的关联对象
深克隆
克隆一个对象,把关联的对象也进行克隆,克隆出一个新的关联对象
实现克隆的方法
public class Person implements Cloneable{
int num;
String name;
public Person() {
}
public Person(int num, String name) {
this.num = num;
this.name = name;
}
/*
重写Object类中clone()方法
*/
@Override
protected Person clone() throws CloneNotSupportedException {
Person person = (Person)super.clone();
return person;
}
@Override
public String toString() {
return "Person{" +
"num=" + num +
", name='" + name + '\'' +
'}';
}
}
如何实现深克隆:
方式1:
关联的对象也要实现Cloneable接口,重新clone(),不管有多少级,只需要深克隆,那么就需要多级克隆
方式2:
对象序列化,反序列化
对象序列化—将对象信息输出
对象反序列化—将输出的对象信息,重新输入