目录


1.什么是注解

注解是从 jdk5 引入的技术,它用来对程序进行声明,本身并不是程序的一部分(从这一点看相当于注释)。它可以声明在包,类,字段,方法,局部变量,方法参数的前面,对这些进行说明注释。
注解的格式:@注解名称(参数),其中的参数值可以存在也可以没有,这要看具体的注解。

2.内置注解

java 中预定义了一些注解,主要有@Override(重写),@Deprecated(过时),@SuppressWarnings( 抑制警告 )

  • @Override : 定义在java.lang.Override中,它只能修饰方法,表示下面的方法是从父类或者父接口继承来的,并且要重写。
  • @Deprecated:定义在java.lang.Deprecated中,它可以用来修饰方法,属性,类,表示下面所修饰的方法,属性,类已经过时了,不推荐使用。
  • @SuppressWarnings:定义在java.lang.SuppreddWarnings中,用来抑制编译时的警告信息。与前两个注解不同的是这个注解要添加参数才能使用。
    @SuppressWarnings(“all”),@SuppressWarnings(“unchecked”),@SuppressWarnings(value={“uncheck”,“deprecation”})等等

3.元注解(mete-annotation)

元注解是用来负责注解其他注解的,java提供了四个标准的元注解来对其他注解的类型进行说明。分别是 @Target, @Retention, @Documented, @Inherited

  • @Target:用来描述注解的使用范围,可选参数有TYPE(作用于类上),METHOD(作用于方法上),FIELD(作用于成员变量上)
  • @Retention:表示注解被保留的阶段,可选参数有SOURCE,CLASS,RUNTIME,其中范围由大到小是RUNTIME>CLASS>SOURCE,即RUNTIME就包含了后两者的范围。所以经常用的就是RUNTIME。
  • @Documented:说明注解将被包含在javadoc中
  • @Inherited:说明子类可以继承父类的该注解

4.自定义注解

格式:

(public) @interface 注解名称{属性列表}

注解本质上就是一个接口,该接口在使用上面的格式自定义注解时 , 会自动继承java.lang.annotation.Annotation接口 ,同时属性列表里的属性表示该注解要实现的功能,想要实现什么作用,就在属性里自主定义。
属性列表的属性只能在基本类型,Class,String,enum中选,不能随意定义。

属性列表的说明:

  • 定义属性时,如果使用default关键字给属性默认化初始值,则使用注解时可以不用赋值,直接使用即可。
  • 如果属性列表只有一个属性要赋值且属性名称是value,则value可以省略,直接定义值即可。
  • 数组赋值时,值使用{}包裹,如果数组中只有一个值,则{}可以省略。
  • 注解元素必须要赋值,或者default默认值,或者在使用注解时在()里自行赋值。

5.注解与反射的结合及应用

// 定义一个含参注解
// 表示自定义的注解的范围是作用于方法上
@Target(ElementType.METHOD)
// 表示注解保留的阶段是runtime,源码运行时有
@Retention(RetentionPolicy.RUNTIME)
// 说明注解将被包含在javadoc中
@Documented
// 说明子类可以继承父类的该注解
@Inherited
@interface MyAnnotation {
    String username();

    int age() default 30;
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class AnnotationTest {

    @MyAnnotation(username = "xxx")
    public void print(String username, int age) {
        System.out.println(username + " " + age);
    }

    @Test
    public void test() throws Exception {
        // 把类加载进内存同时获取Class类对象
        Class<AnnotationTest> clazz = AnnotationTest.class;
        // 获取到AnnotationTest类的实例化对象
        AnnotationTest annotationTest = clazz.newInstance();
        Method print = clazz.getMethod("print", String.class, int.class);
        // 获取方法上的注解
        MyAnnotation myAnnotation = print.getAnnotation(MyAnnotation.class);
        String username = myAnnotation.username();
        int age = myAnnotation.age();
        // 调用方法同时将注解的属性值传入
        print.invoke(annotationTest, username, age);
    }
}
©本文为原创文章,著作权归博主所有,转载请联系博主获得授权

发表评论