Java进阶--注解与克隆

Java注解

概念

        Java注解,又称Java标注,JDK5.0引入。

        可以加在包,类,变量,方法上,可以通过发射机制获取到标注的内容。

        可以随着代码进行编译,嵌入字节码;

        运行时可以获取到,可以对程序进行一些标注作用。

分类

内置注解

Java中已有的注解,由Java提供,已经定义好的。

//重写注解
@Override 
//注解已过时方法
@Deprecated
//用于忽略注解中的警告
@SuppressWarnings
//用于被修饰的接口是函数式接口
@Functionalnterface

元注解

        由JavaApi提供,用于修饰注解的注释,通常用在注解的定义上。

//标识这个注解怎么保存
@Retention
//标记这个注解是否包含在用户文档中
@Documented
//标记这个注解的应用范围
@Target
// 标记这个注解是继承与那个注解类
@Inherited
// 标识某个注解可以在某个声明上使用多次
@Repetable
@Target
ElementType.TYPE            //可以应用于类的任何元素。
ElementType.CONSTRUCTOR     //可以应用于构造函数。
ElementType.FIELD           //可以应用于字段或属性。
ElementType.LOCAL_VARIABLE  //可以应用于局部变量。
ElementType.METHOD          //可以应用于方法级注释。
ElementType.PACKAGE         //可以应用于包声明。
ElementType.PARAMETER       //可以应用于方法的参数。

@Retention
SOURCE     //在源文件中有效(即源文件保留)
CLASS      //在 class 文件中有效(即 class 保留)
RUNTIME    //在运行时有效(即运行时保留)

自定义注解

自定义注解@NotNull

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
//作用于属性
@Retention(RetentionPolicy.RUNTIME)
//作用于运行时
public @interface NotNull {
    
    //提示信息
	String message() default "";
	
    // 长度
	int length() default 0;
	
    // 与长度有关的提示
	String lengthmessage() default "";
}

对象克隆

为什么要克隆?

        克隆可以实现对象的快速备份,在实际中,一个模型类需要为不同层提供不同的对象,就需要将一个对象的数据克隆到另一个对象中。

        为什么不直接new一个对象,new创建出来的对象不包含我们想要的数据,

    Admin admin1 = new Admin();
    Admin admin2 = admin1; 

        这种情况虽然创造了两个Admin 引用,但是两个Admin引用最终指向同一个对象,对一个进行操作时,相当于对另一个也做出同样操作,不是我们想要的结果。

        而克隆就能解决这一问题。

分类

浅克隆

        在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成
员变量,而引用类型的成员对象并没有复制。

实现方法:

通过覆盖Object类中的clone()方法就能实现浅克隆 

    //前提是实现Cloneable接口
    @Override
    protected Person clone() throws CloneNotSupportedException {
        Person person = (Person)super.clone();
        return person;
    }

深克隆

        在克隆时,就算关联对象,也会就关联对象创建一个新的,称之为深克隆。

  

实现方法:

方法一:让关联对象也实现Cloneable接口,重写clone()方法,从而实现多级克隆,每关联一个对象,就让关联对象实现接口并重写clone()方法,逐层实现。

方法二:使用序列化与反序列化实现。

    //实现Serializable接口
    /**
     * 自定义克隆方法
     * @return
     */
    public Person myclone() {
            Person person = null;
                try {
                    /*
                    将该对象序列化成流,因为写在流里的是对象的一个拷贝,
                    而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
                     */
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(baos);
                    oos.writeObject(this);
                    // 将流序列化成对象
                    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                    ObjectInputStream ois = new ObjectInputStream(bais);
                    person = (Person) ois.readObject();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                }
            return person;
          }

 一步到位,不需要进行多级克隆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值