Java注解(Annotation)-基础

注解是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。

官方解释如下:

注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。

注解有许多用处,主要如下:

  • 提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
  • 编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
  • 运行时的处理: 某些注解可以在程序运行的时候接受代码的提取
    值得注意的是,注解不是代码本身的一部分。

看到一篇文章,说注解如同标签,可以贴到需要使用的地方。仔细想来确实挺贴切的,遂记录下来。

注解的定义:使用@interface关键字定义。

public @interface TestAnnotation{
}

 注解的定义和接口的定义很相似,只是多了一个@符号。

注解的使用:

@TestAnnotation
public class Users{
}

元注解

是一种基本注解,专门用于注解其他的注解。在注解类上使用另一个注解类,那么被使用的注解类就称为元注解。

java中主要有四种元注解:@Retention、@Documented、@Target、@Inherited

@Retention:英文翻译为保留,保持;定义该注解的保留策略,即生命周期。

取值如下:

  • RetentionPolicy.SOURCE 注解只存在于源码中,在编译器进行编译时将被丢弃。因此这些注解不会写入class字节码。@Override, @SuppressWarnings都属于这类注解。
  • RetentionPolicy.CLASS 注解会被编译到class字节码中,但是在类加载的时候被丢弃,并不会被加载到 JVM 中。注解默认使用这种方式。
  • RetentionPolicy.RUNTIME  注解会一直保留到程序运行的时候,会被加载到JVM中,因此可以使用反射机制来读取注解的信息。我们自定义的注解通常使用这种方式。
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{}

@Documented:表示是否将注解信息添加到java文档中

@Target:表示注解可以用在哪些地方,如果不明确指出,该注解可以放在任何地方。

取值范围如下:

  • ElementType.ANNOTATION_TYPE //注解
  • ElementType.CONSTRUCTOR //构造方法
  • ElementType.FIELD //属性
  • ElementType.LOCAL_VARIABLE //局部变量
  • ElementType.METHOD //方法
  • ElementType.PACKAGE //包
  • ElementType.PARAMETER //方法内的参数
  • ElementType.TYPE //可以给一个类型进行注解,比如类、接口、枚举

@Inherited:继承,遗传;表示某个类继承父类的注解,只对类元素有效。

比如:父类A有一个注解TestAnnotation,并且使用了@Inherited声明,子类B继承(extends)了父类A,那么类B同时也继承了父类A的注解TestAnnotation。

注解的属性

完整的注解还需要包含一些属性,如下所示:属性名后面需要加括号()。

注:属性的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。

​
public @interface TestAnnotation{
String name() default "admin";//为name属性设置默认值admin
int userId();
}

​

使用注解:

@TestAnnotation(name="test",userId=1)

public class Test(){}

若注解只有一个名为value的属性,则使用的时候只需要在注解后面添加值就可以了,不需要写属性名。

若注解没有任何属性,使用时只需要写“@注解名”即可,不用写括号。

需要注意的是,我们使用了自定义的注解后,这些 Annotation 不会自己生效,必须由开发者提供相应的代码来提取并处理 Annotation 信息。

获取注解内容(撕标签,查看标签的内容)

调用注解需要使用反射机制。

/**
*isAnnotationPresent方法用于判断类Test是否使用了某个注解,这里是TestAnnotation
**/
boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
        if ( hasAnnotation ) {
//getAnnotation方法用于获取特定的注解对象,
//也可使用getAnnotations()方法获取该类使用的所有注解
            TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
            System.out.println("userId:"+testAnnotation.userId());
            System.out.println("name:"+testAnnotation.name());
        }

获取属性和方法上使用的注解类似:

//获取一个成员变量上的注解
Field userName = Test.class.getDeclaredField("userName");
userName.setAccessible(true);
            
TestAnnotation testAnnotation= userName.getAnnotation(TestAnnotation.class);
if ( testAnnotation!= null ) {
   System.out.println("annotaiton value:"+testAnnotation.name());
}
// 获取方法中的注解
  Method testMethod = Test.class.getDeclaredMethod("testMethod");
  if ( testMethod != null ) {          
      Annotation[] a = testMethod.getAnnotations();
      for( int i = 0;i < a.length;i++) {
         System.out.println("method annotation:"+ a[i].annotationType().getSimpleName());
      }
  }

最后附上参考的链接:链接

你可能感兴趣的:(Java,Java,注解)