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接口@Overrideprotected 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;}
一步到位,不需要进行多级克隆。