注解(Annotation):又称标注,是jdk5.0开始引入的技术,可以对程序进行解释说明,并可以被其他程序读取。可以在类、方法、变量、参数和包上使用。本次笔记从注解中的内置注解、元注解以及自定义注解开始~
一、内置注解
三个常见的内置注解:
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
以Override注解为例:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
可以看到注解的定义格式是:@interface 注解名
二、元注解
元注解:用来描述说明其他注解的注解
- @Target:用来描述注解的使用范围(定义注解的作用域)
public @interface Target {
ElementType[] value();
}
@Target 注解定义了一个ElementType类型的参数,而ElementType是一个枚举类,从下表可以看到 @Target 注解所需传入的参数
常量值 | 说明 |
---|---|
ANNOTATION_TYPE | 注释类型声明 |
CONSTRUCTOR | 构造方法声明 |
FIELD | 字段声明(包括枚举常量) |
LOCAL_VARIABLE | 局部变量声明 |
METHOD | 方法声明 |
PACKAGE | 包声明 |
PARAMETER | 参数声明 |
TYPE | 类、接口(包括注释类型)或枚举声明 |
-
@Retention:表示需要在什么级别保存该注解(用于描述注解的生命周期)
三个取值从大到小依次是:RUNTIME>CLASS>SOURCERUNTIME:将注释记录在类文件中,在运行VM时将保留注释,因此可以被反射读取
CLASS:将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
SOURCE:编译器要丢弃的注释。只在源码中有效。
-
@Documented :说明该注释将被包含在javadoc中。
-
@Inherited :说明子类可以继承父类中的该注释。
# 三、自定义注解 使用注解的命名规则搭配元注解可以定义我们自己的自定义注解来达到我们所需要的效果(通常与反射一起使用来动态生成sql)
下面是一个简单的例子:
public class AnnotationDemo{
public static void main(String[] args) throws Exception{
Class<AnnotationDemo> cls = AnnotationDemo.class;
Method m = cls.getMethod("getAnnotation",String.class,int.class);
Annotation[] annotations = m.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
Class<? extends Annotation> type = annotation.annotationType();
System.out.println(type.getSimpleName());
}
}
@Myannotation(name = "Esion")
public static void getAnnotation(String name,int age){
System.out.println("name: "+name+ " age: "+age);
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Myannotation{
String name();
int age() default 18;
int id() default -1;
}
输出如下:
@basic.annotationDemo.Myannotation(id=-1, age=18, name=Esion)
Myannotation