当前位置: 首页 > article >正文

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:

对象序列化,反序列化

对象序列化—将对象信息输出

对象反序列化—将输出的对象信息,重新输入


http://www.kler.cn/a/587006.html

相关文章:

  • 元音辅音字符串计数leetcode3305,3306
  • 自然语言秒转SQL—— 免费体验 OB Cloud Text2SQL 数据查询
  • 软件行业的“3.15问题”有哪些?如何防止?
  • C++ unordered_map unordered_set 模拟实现
  • Certbot实现SSL免费证书自动续签(CentOS 7版 + Docker部署的nginx)
  • 测试工程师指南:基于需求文档构建本地安全知识库的完整实战
  • HarmonyOS第24天:鸿蒙应用安全秘籍:如何为用户数据筑牢防线?
  • 使用Python实现经典贪吃蛇游戏教程
  • python相关语法的学习文档1
  • 4.3 计算属性与watch的类型守卫实现
  • 软考高级《系统架构设计师》知识点(十三)
  • Day2 导论 之 「存储器,IO,微机工作原理」
  • 代码随想录二刷|图论6
  • 【.Net 9下使用Tensorflow.net---通过LSTM实现中文情感分析】
  • C++中std::count` 和 `std::count_if`的用法和示例
  • 数据结构-单链表专题
  • 【开源代码解读】AI检索系统R1-Searcher通过强化学习RL激励大模型LLM的搜索能力
  • DataEase:一款国产开源数据可视化分析工具
  • 蓝桥杯Python赛道备赛——Day5:算术(一)(数学问题)
  • 在Linux中安装Nginx