一、注解的定义

  1. public @interface myannotations{
  2. 属性列表;
  3. }
  4. @interface 实际表示注解继承 Annotation

可以参考:https://www.zhihu.com/question/47449512

  1. package java.lang.annotation;
  2. public interface Annotation {
  3. boolean equals(Object obj);
  4. int hashCode();
  5. String toString();
  6. Class<? extends Annotation> annotationType();
  7. }

二、注解的类型

主要有三类:

自定义注解: JDK内置注解:如:override 第三方框架提供的注解:如:Spring中 Atuowired

2.1 自带的注解

  1. @Deprecated -- @Deprecated 所标注内容,不再被建议使用。
  2. @Override -- @Override 只能标注方法,表示该方法覆盖父类中的方法。
  3. @Documented -- @Documented 所标注内容,可以出现在javadoc中。
  4. @Inherited -- @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。
  5. @Retention -- @Retention只能被用来标注“Annotation类型”,而且它被用来指定AnnotationRetentionPolicy属性。
  6. @Target -- @Target只能被用来标注“Annotation类型”,而且它被用来指定AnnotationElementType属性。
  7. @SuppressWarnings -- @SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。

重要的元注解(用来修饰注解的注解)
ElementType:指定注解的类型。

  1. package java.lang.annotation;
  2. public enum ElementType {
  3. TYPE, /* 类、接口(包括注释类型)或枚举声明 */
  4. FIELD, /* 字段声明(包括枚举常量) */
  5. METHOD, /* 方法声明 */
  6. PARAMETER, /* 参数声明 */
  7. CONSTRUCTOR, /* 构造方法声明 */
  8. LOCAL_VARIABLE, /* 局部变量声明 */
  9. ANNOTATION_TYPE, /* 注释类型声明 */
  10. PACKAGE /* 包声明 */
  11. }

RetentionPolicy:用来指定注解的作用域。

  1. package java.lang.annotation;
  2. public enum RetentionPolicy {
  3. SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */
  4. CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */
  5. RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
  6. }

例子:定义一个可以修饰类、方法的注解,且该注解可以在运行时生效。

  1. @Target({ElementType.TYPE,ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface MyAnnotation{
  4. }

2.2 第三方注解

Spring Autowired注解,判断是否需要自动装置。

  1. import java.lang.annotation.Documented;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
  7. @Retention(RetentionPolicy.RUNTIME)
  8. @Documented
  9. public @interface Autowired {
  10. boolean required() default true;
  11. }

三、使用与作用

使用:用在类、方法、成员变量等的前面。和类、接口是类似的。

3.1 编译检查

如:@SuppressWarnings、@Deprecated 等

3.2 反射中使用注解

通过反射判断是否包含某些注解,然后进行相应的操作。

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.TYPE)
  3. public @interface PrintDate {
  4. String value() default "20210503";
  5. }
  6. @PrintDate(value="20210603")
  7. public class AnnotationClass1 {
  8. public String toString(){
  9. return "AnnotationClass1";
  10. }
  11. }
  12. import java.lang.annotation.Annotation;
  13. import java.lang.reflect.Method;
  14. public class AnnotationTest {
  15. public static void main(String args[]){
  16. AnnotationClass1 class1 = new AnnotationClass1();
  17. Annotation[] annotations = class1.getClass().getDeclaredAnnotations();
  18. // 判断类是否包含注解
  19. if(class1.getClass().isAnnotationPresent(PrintDate.class)){
  20. System.out.println(class1);
  21. }
  22. for(Annotation annotation : annotations){
  23. System.out.println(annotation+" : "+((PrintDate)annotation).value());
  24. }
  25. }
  26. }
  1. 注意:方法、类都可以得到注解
  2. Class<?>.getDeclaredAnnotations();
  3. Method.getDeclaredAnnotations();

3.3 注入数据

参考
1、java教程-注解
2、Spring Autowired注解
3、Lombok原理分析及简单分析