注解是什么
- Annotation的作用
- 不是程序本身,可以对程序做出解释(与注释(comment)一样)
- 可以被其他程序(编译器等)读取
- 有检查,约束等作用
- Annotation的格式
- 以@“注释名”在代码中存在,可以添加参数值
- Annotation使用的地方
- 可以附加在package,class,method,field上面,相当于添加了额外的辅助信息,可以通过反射机制编程实现多这些元数据的访问
- 注解就是一个接口,内容就是接口方法,解析时通过调用方法获取值
内置注解
- @Override
- 只用于修饰方法
- 表示一个方法打算重写或者实现超类中的另一个方法的声明
- @Deprecated
- 修饰方法、类、属性
- 表示不鼓励程序员使用这样的元素,通常很危险或者存在更好的选择
- @SuppressWarnings
- 用于抑制编译是的警告信息
- 需要添加参数才能使用,参数都是定义好的,选择性的使用就好了
- 参数:@SuppressWarnings("all"),@SuppressWarnings("unchecked"),@SuppressWarnings(values={"unchecked","deprecation"})
元注解
- 负责注解其他注解
- java定义4个标准的meta-annotation类型,用来对其他annotation类型做说明
- z元注解类型和所支持的类可以在java.lang.annotation中找到
- @Target: 描述注解的使用范围
- @Retention:表示需要在什么级别保存注解信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)
- 前面有提到注解按生命周期来划分可分为3类:
- SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
- CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
- RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
- 这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
- 首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。
- @Document: 说明该注解将包含在javadoc中
- @Inherited: 说明子类可以继承父类中的注解
自定义注解
-
使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口
-
@interface用来声明一个注解,格式:public @interface 注解名{...}
-
其中每一个方法实际上是声明了一个配置参数
-
方法的名称就是参数的名称
-
返回值类型就是参数的类型(返回值只能是class,string,enum)
-
通过default来声明参数的默认值
-
只有一个参数成员,一般参数名为value,因此在注解里面可以省略(value)
-
注解元素必须要有值,经常使用空字符串,0作为默认值
-
public class test03 { //注解可以显示赋值,没有默认值必须赋值 @MyAnotation public void test() { } } //使用范围 @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnotation{ ///注解的参数:参数类型+参数名() String name() default ""; int age() default 0; int id() default -1; //默认值为-1,代表找不到 String[] shcools() default {"清华","华科"}; } //单个值 @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnotation2{ String value() default ""; }
-