目录
② @Deprecated(修饰的结构已经过时,建议用新方案)
②自定义的Annotation自动继承了java.lang.annotation.Annotation接口
③Annotation的成员变量在定义时以无参数方法的形式来声明。
⑤ 可以在定义Annotation的成员变量时为其指定初始值 —— default
四、jdk提供的4种元注解 —— 用于修饰其他Annotation的定义
元数据的理解:String name = "atschool";
一、注解的概述
Annotation其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理
Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保留在Annotation的“name = value”中
未来的开发模式都是基于注解的,在一定程度上,可以说:框架 = 注解+反射+设计模式
二、常见的Annotation示例
使用Annotation时要在其前面加上@符号,并把该Annoation当成一个修饰符使用。用于修饰它支持的程序元素
(一)生成文档的相关的注解
(二)在编译时进行格式检查(JDK内置的三个基本注解)
① @Override
public class AnnotationTest {
}
class Person{
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public void walk(){
System.out.println("人走路");
}
public void eat(){
System.out.println("吃饭");
}
}
interface Info{
void show();
}
class Student extends Person implements Info{
@Override //可以不加,但是编译时不会校验,有可能不是重写
public void walk() {
System.out.println("学生走得快");
}
@Override //一定是重写父类或实现接口中的方法
public void show() {
}
}
② @Deprecated(修饰的结构已经过时,建议用新方案)
在老的项目中仍然可以使用(向下兼容)
③ @SuppressWarnings(抑制编译器警告)
idea中以灰色呈现
加上注解后变正常
(三)跟踪代码的依赖性,实现替代配置文件功能
- Servlet3.0提供了注解(annoation),使得不再需要在web.xml文件中进行Servlet的部署
- Spring框架中关于“事务”的管理
三、如何自定义注解
参照@SuppressWarnings定义
①注解声明为@interface
②自定义的Annotation自动继承了java.lang.annotation.Annotation接口
③Annotation的成员变量在定义时以无参数方法的形式来声明。
其方法名和返回值定义了成员的名字和类型。称为配置参数。类型只能是八种基本数据类型、String型、Class型、enum型、Annotation型
④如果只有一个参数成员,建议使用参数名为value
⑤ 可以在定义Annotation的成员变量时为其指定初始值 —— default
指定成员变量的初始值可以使用default关键字
⑥标记
没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation
⑦注意
- 自定义注解必须配上注解的信息处理流程(使用反射)才有意义
- 自定义注解通常都会指明两个元注解:Retention、Target
四、jdk提供的4种元注解 —— 用于修饰其他Annotation的定义
JDK5.0提供了4个标准的meta-annotation类型:
- Retention
- Target
- Documented
- inherited
对现有的注解进行解释说明的注解
元数据的理解:String name = "atschool";
对现有数据的修饰
Ⅰ.@Retention
只能用于修饰一个Annotation定义,用于指定该注解的生命周期,@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention时必须为该value成员变量指定值
SOURCE\CLASS(默认行为)\RUNTIME只有声明为RUNTIME生命周期的注解,才能通过反射获取
Ⅱ.@Target
用于修饰Annoation定义,用于指定被修饰的Annotion能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量
Ⅲ.@Documented
用于指定被该元注解修饰的注解类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的
定义为Documented的注解必须设置Retention值为RUNTIME
Ⅳ.@Inherited
被它修饰的注解将具有继承性。
五、通过反射获取注解信息
@Test
public void testGetAnnotation() {
Class studentClass = Student.class;
Annotation[] annotation = studentClass.getAnnotations();
for (int i = 0; i < annotation.length; i++) {
System.out.println(annotation[i]);
}
}
六、JDK8中注解的新特性
可重复注解、类型注解
(一)可重复注解:@Repeatable
如何实现:
①在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
②MyAnnotation的Target和Retention和MyAnnotations相同
(二)类型注解
ElementType.TYPE_PARAMETER
表示该注解能写在类型变量的声明语句中
ElementType.TYPE_USE
表示该注解能写在使用类型的任何语句中