- 概念
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
官方解释:注解(一种元数据形式)提供有关不属于程序本身的程序的数据。注解对它们注解的代码的操作没有直接影响。
简单理解为:给代码贴上标签,不影响它运用。
2、用途
- 编译器的信息 - 编译器可以使用注解来检测错误或抑制警告,如@Override,可以在编译时检查是否是重载方法。
- 编译时和部署时处理 - 软件工具可以处理注解信息以生成代码,XML文件等。
- 运行时处理 - 可以在运行时检查某些注解。
3、内置的注解
注解名 | 作用 |
@Override | 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。 |
@Deprecated | 标记过时方法。如果使用该方法,会报编译警告。 |
@SuppressWarnings | 指示编译器去忽略注解中声明的警告。 |
@Retention元注解 | 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。 |
@Documented元注解 | 标记这些注解是否包含在用户文档中。 |
@Target元注解 | 标记这个注解应该是哪种 Java 成员。 |
@Inherited元注解 | 标记这个注解是继承于哪个注解类(默认注解并没有继承于任何子类) |
@SafeVarargs | Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。 |
@FunctionalInterface | Java 8 开始支持,标识一个匿名函数或函数式接口。 |
@Repeatable元注解 | Java 8 开始支持,标识某注解可以在同一个声明上使用多次。 |
4、注解架构
5、注解属性类型可以有以下列出的类型
(1)基本数据类型
(2)String
(3)枚举类型
(4)注解类型
(5)Class类型
(6)以上类型的一维数组类型
6、接口定义
格式:
public @interface 注解名{
定义方法
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String CHANGLIANG="常量";
String value() default "123";
String name() ;
}
7、注解使用
@MyAnnotation(name="name")
public class TestMyAnnotation {
}
(1)当注解中只有value方法时,可以省略不写,直接赋值。
@MyAnnotation("123")
(2)当注解中有默认值时,可以不用赋值
@MyAnnotation(name="name")
(3)当注解中有多个方法,都没有默认值,全部都需要赋值。
@MyAnnotation(name="name")
8、注解获取
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
@MyAnnotation(name="name")
public class TestMyAnnotation {
@MyAnnotation(value = "void",name="Method")
public void setName(){
}
public static void main(String[] args) {
//获取类的注解
Annotation[] annotations = TestMyAnnotation.class.getAnnotations();
for (Annotation annotation:annotations) {
MyAnnotation myAnnotation = (MyAnnotation)annotation;
System.out.println(myAnnotation.name());
System.out.println(myAnnotation.value());
}
//获取方法的注解
Method[] methods = TestMyAnnotation.class.getDeclaredMethods();
for (Method method:methods) {
Annotation[] methodAnnotations = method.getAnnotations();
if(methodAnnotations!=null){
for (Annotation annotation:methodAnnotations) {
MyAnnotation myAnnotation = (MyAnnotation)annotation;
System.out.println(myAnnotation.name());
System.out.println(myAnnotation.value());
}
}
}
}
}