注解Annotation,JDK5.0之后引入的特性。
用于描述元数据的
修饰符
,包括类、成员变量、构造方法、方法参数、以及包声明等的信息的元数据。格式:@注解名
例如:
class Father {
public void show(){
System.out.println("Father show");
}
}
class Son extends Father{
@Override
public void show(){
System.out.println("Son show");
}
}
@Override
,如上例,标记指定方法是一个重写方法,若没有重写,则会报错
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@SupressWarnings
,放置在类和方法上,作用是阻止编译器发出某些警告信息。
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
它可以阻止的警告类型(value)如下:
示例:
import java.util.ArrayList;
import java.util.List;
//@SuppressWarnings( "all"),压制所有警告
public class Demo01 {
public static void main(String[] args) {
//@SuppressWarnings("unused")
int num = 1;//num没有用过,会报未使用警告,使用上面的方式可去除警告
//@SuppressWarnings(value = {"rawtypes","unused"})
List list = new ArrayList();
}
}
@Deprecated
,用于标记当前类、成员变量、成员方法或者构造方法过时
,如果开发者调用了被标记为过时的 方法,编译器在编译期进行警告。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
public class Demo02 {
public static void main(String[] args) {
//@Deprecated : 标记一个类、方法、变量,是过时!!!
Son son = new Son();
son.method01();
System.out.println(son.num);
}
}
class Son {
@Deprecated
public int num = 1;
@Deprecated
public void method01(){
System.out.println("Son method01");
}
}
标记注解
单值注解
完整注解
作用在自定义注解上
,规定自定义注解的作用区域
、存活策略
格式:@interface 注解名
@Target
public @interface Target {
ElementType[] value();
}
public enum ElementType {
TYPE,//类、接口、注解、枚举
FIELD,//成员变量
METHOD,//成员方法
PARAMETER,//形参
CONSTRUCTOR,//构造器
LOCAL_VARIABLE,//局部变量
ANNOTATION_TYPE,//注解类型
PACKAGE,//包
TYPE_PARAMETER,//类型参数,JDK 1.8 新增
TYPE_USE//使用类型的地方,JDK 1.8 新增
}
@Retention
public @interface Retention {
RetentionPolicy value();
}
public enum RetentionPolicy {
SOURCE,//仅存活在源码
CLASS,//存活在编译期
RUNTIME//存活在运行时
}
@Documented注解
public @interface Documented { }
示例:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* 自定义注解MyAnnotation
*/
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation {
public String value() default "这是@Documented注解为文档添加的注释";
}
@MyAnnotation()
public class Test {
@Override
@MyAnnotation
public String toString() {
return this.toString();
}
}
命令执行完之后,会在当前目录下生成一个doc文件夹
包含如下内容:
打开index.html
生成的是帮助文档,会显示MyAnnotation注解。在MyAnnotation中去掉@Documented,在帮助文档中不会显示该注释。
@Inherited注解
自定义注解格式
@Retention(RetentionPolicy.RUNTIME)
public @interface 注解名 {
数据类型 属性名1() default 默认值1;//default可省略
数据类型 属性名2() ;
数据类型[] 属性名3() default {值1,值2,...};
}
示例:
/**
* 自定义注解MyAnnotation01
*/
public @interface MyAnnotation01 {
String username() default "root";
String password() default "root123";
String[] course default {"软件测试","软件工程"}
String value();
}
注意
:只有value属性没有默认值并单独使用时可以省略“value = ”,如:
@MyAnnotation01("hello_world")