java注解Annotation

时间 2019/4/29 16:53:34 加载中...

什么是注解

先以我们知道的知识来引入,当我们新建一个类的时候,我们要重写 toString 方法,就会写如下的代码:

  1. @Override
  2. public String toString(){
  3. return "something";
  4. }

这里的 @Override 就是一个注解。它标明了 toString 是一个”重写”方法.

所以 注解就是为我们的代码添加额外的声明,提供额外的信息。

我们可以为 “包”,“类”,“属性”,“方法”,“方法参数“ 等添加信息,因此 注解 可以应用在这些上面。

如何声明一个注解

注解和接口的声明差不多。注解使用的关键字是 @interface

声明一个名为 IsUseful 的注解

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @interface IsUseful {}

元注解

我们可以看到,在注解上方还有 @Target @Retention,这相当于注解的注解。
就是描述注解的信息,我们称之为“元注解”。

@Target

@Target元注解表明了此此注解可以应用在什么地方。
其值常见的有
ElementType.TYPE 指注解应用在“类”上
ElementType.FIELD 指注解应用在“字段”上
ElementType.METHOD 指注解应用在“方法”上

为Target指定多个值

  1. @Target(value={ElementType.TYPE,ElementType.METHOD}) //表明应用到方法和类上面
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @interface IsUseful {
  4. }

@Retention

@Retention元注解表明了此此注解保留到什么时候,什么时候还有它。
RetentionPolicy.RUNTIME 指注解保留到运行时。
RetentionPolicy.CLASS 指注解保留到编译阶段,即 class 文件时期。
RetentionPolicy.SOURCE 指注解只是在java源文件中存在,其它时候都没有。

注解属性

我们还可以为注解添加属性信息,和类中的字段差不多。

  1. @Target(value={ElementType.TYPE,ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @interface IsUseful {
  4. //定义了一个 who 属性,默认值为 me
  5. String who() default "me";
  6. }

属性类型还可以是其它类型,比如 枚举。

注解的使用

声明好注解后,就可以使用了,使用方法和 @override 相同。

  1. @IsUseful(who="xiaoming")
  2. class Person{
  3. @IsUseful
  4. public void say(){}
  5. }

注解和反射

当在类或者方法上应用注解后,我们可以通过反射来判断和获取注解信息

  1. //通过反射判断是否使用了某个注解
  2. boolean isUseful = Person.class.isAnnotationPresent(IsUseful.class);
  3. P.print(isUseful);
  4. //获取注解的信息
  5. IsUseful isUseful1 = Person.class.getAnnotation(IsUseful.class);
  6. P.print(isUseful1);
  7. P.print(isUseful1.who());

输出结果

  1. true
  2. @AnnotationDemo.IsUseful(who=xiaoming)
  3. xiaoming
扫码分享
版权说明
作者:SQBER
文章来源:http://www.sqber.com/articles/java-annotation.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。