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