什么是注解?
-
Annotation 是从JDK5.0开始引入
-
Annotation 的作用
不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)
可以被其他程序(比如:编译器等)读取
-
Annotation的格式
注解是以“@注解名”在代码中存在,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")
-
Annotation在哪使用?
可以附加在package,class,method,field 等上面,相当于给他们添加了额外的辅助信息,可以通过反射机制编程实现对这些原数据的访问
内置注解
-
@Override:定义在 java.lang.Override 中,此注释只适用于修辞手法,表示一个方法声明打算重写超类中的另一个方法声明
-
@Deprecated:定义在 java.lang.Deprecated 中,此注释可以用于修辞手法,属性,类,表示不鼓励程序使用这样的元素,通常是因为它很危险或者存在更好的选择
-
@SuppressWarnings:定义在 java.lang.SuppressWarnings 中,用来抑制编译时的警告信息
元注解
元注解的作用就是负责注解其他注解,Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明
-
@Target:用于描述注解的范围,即注解在哪用。
它说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)等。
取值类型(ElementType)有以下几种:
-
CONSTRUCTOR:用于描述构造器
-
FIELD:用于描述域即类成员变量
-
LOCAL_VARIABLE:用于描述局部变量
-
METHOD:用于描述方法
-
PACKAGE:用于描述包
-
PARAMETER:用于描述参数
-
TYPE:用于描述类、接口(包括注解类型) 或enum声明
-
TYPE_PARAMETER:1.8版本开始,描述类、接口或enum参数的声明
-
TYPE_USE:1.8版本开始,描述一种类、接口或enum的使用声明
@Target(value = {ElementType.METHOD, ElementType.TYPE}) @interface MyAnnotation{ }
-
-
@Retention:用于描述注解的生命周期,表示需要在什么级别保存该注解,即保留的时间长短。
取值类型(RetentionPolicy)有以下几种:
-
SOURCE:在源文件中有效(即源文件保留)
-
CLASS:在class文件中有效(即class保留)
-
RUNTIME:在运行时有效(即运行时保留)
@Target(value = {ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation{ }
-
-
@Documented:用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。它是一个标记注解,没有成员。
@Target(value = {ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @interface MyAnnotation{ }
-
@Inherited:用于表示某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类
自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class AnnotationDemo {
//注解可以显示赋值,如果没有默认值,则必须给注解赋值
@MyAnnotation(index = 10,name = "world")
public void test(){}
}
@Target({ElementType.METHOD,ElementType.TYPE})//作用域
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
//注解参数:参数类型 + 参数名()
String name() default "";//default 默认值
int index();
String[] vals() default {"hello"};
}