java annotation

先用通俗易懂的语言来介绍annotation

annotion 注解,当然这个名字太学术了,你可以理解它为标签。

比如说,小明有辆好车,大家给了他一个标签,表示其很有钱。而annotation就类似这么一个东西,它可以给 方法、字段 等等贴上一个标签,方便编程。

在Java内,有三种预置的annotation

1、@Override

这个注解很常见,用来表示该方法是一个重写的了方法,在编译期间会检查该方法是不是被重写了,如果没有,编译不通过,报错

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Target  //注解的作用目标

  • ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
  • ElementType.FIELD:允许作用在属性字段上
  • ElementType.METHOD:允许作用在方法上
  • ElementType.PARAMETER:允许作用在方法参数上
  • ElementType.CONSTRUCTOR:允许作用在构造器上
  • ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
  • ElementType.ANNOTATION_TYPE:允许作用在注解上
  • ElementType.PACKAGE:允许作用在包上

@Retention  //注解的生命周期

  • RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件
  • RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件
  • RetentionPolicy.RUNTIME:永久保存,可以反射获取

2、@Deprecated

废弃警告

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

发现多了一个@Documented,@Documented  //表示注解会加入文档 Javadoc

@SuppressWarnings

压制警告

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}

上述三种是Java默认提供的预置注解,不过我们有时候会需要一些自定义的注解,比如前面有辆好车的小明,他的车是租的,那么就不该贴上有钱这个标签,可以贴一个爱炫耀的标签,但是Java又不提供爱炫耀这个标签

所以这个时候需要使用自定义注解来实现定制化需求

比如:

我有这么一个对象

class student{

  public string name;

  public string age;

}

我想要给 name 贴上一个注解,表示其是第一个字段

给 age 贴上一个注解,表示其是第二个字段

自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface FieldOrdinal {
short ordinal() default 0;
}

class student{

 @FieldOrdinal(ordinal = 1)
public string name;
  @FieldOrdinal(ordinal = 2)
public string age;

}

可以看出,其实注解的本质即为接口,Java提供了一种方便的方式配置信息,提高了开发效率,缺点在于提高了耦合性。

Java获取注解的信息时,本质上是invoke()获取方法返回值,所以不难理解 FieldOrdinal 里面有一个方法,而我们使用该注解时设置了方法返回值,即(ordinal = 1)

我们可以用类似的方式注解方法、类等等。

还有一种元注解,可以简单理解为注解的注解,留待以后总结












原文地址:https://www.cnblogs.com/shineyoung/p/11375558.html