先用通俗易懂的语言来介绍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)
我们可以用类似的方式注解方法、类等等。
还有一种元注解,可以简单理解为注解的注解,留待以后总结