JAVA学渣之路--注解篇

9 篇文章 0 订阅

注解概述

annotation: 注解,代码里的特殊标记,可以在编译、类加载、运行时被读取,并执行相应的处理。
1、基本Annotation
@Override : 限定重写父类方法,指需要编译器检查修饰的方法必须是覆盖了父类方法的方法。如果修饰的方法在父类中找不到,则将编译报错。能够避免“低级错误”导致后期排查时的巨大障碍。
@Deprecated : 用于标识某个程序元素已经过时。当其他程序使用已经过时的该元素时,编译器将会给出警告。这种注解好处在于提示类使用者那些方法不宜再用。
@SuppressWarnings : 用于修饰程序元素的所有子元素。使编译器取消显式的编译器警告。同时该效果可叠加。比如、@SuppressWarnings(value=“unchecked”)
@SafeVarargs : 抑制堆污染所导致的编译器报错。
@FunctionalInterface : 用于指定某个接口必须是函数式接口。也就是指告诉编译器,检查该接口只能有一个抽象方法。该注解只能修饰接口,不能修饰其他程序元素。
2、JDK的元Annotation
@Retention : 该注释用于修饰其他注释,被修饰的注释根据该注释的成员变量来决定,被修饰注释能保留多久。@Retention包含一个RetentionPolicy类型的value成员变量,该成员变量的值只能是如下三种:
a、RetentionPolicy.CLASS : 编译器将修饰的Annotation记录在class文件中,当运行JAVA程序时,JVM不可获取Annotation信息。这是默认值。
b、RetentionPolicy.RUNTIME : 编译器将把Annotation记录在class文件中,并且当JAVA程序运行时,JVM可以获取到Annotation信息,程序可以通过反射获取该Annotation信息。
c、RetentionPolicy.SOURCE : Annotation只保留在源代码中,在编译时,编辑器会直接丢弃被修饰的Annotation。
使用方式如下:
@Retention(value= RetentionPolicy.RUNTIME)
或者
@Retention( RetentionPolicy.RUNTIME)
@Target : 用于修饰其他Annotation,指定被修饰的Annotation只能用于修饰特定的程序元素。
取值有如下几种:
ElementType.ANNOTATION_TYPE : 指定该策略的Annotation只能修饰Annotation。
ElementType.CONSTRUCTOR : 指定该策略的Annotation只能修饰构造器。
ElementType.FIELD : 指定该策略的Annotation只能修饰成员变量。
ElementType.LOCAL_VARIABLE : 指定该策略的Annotation只能修饰方法定义。
ElementType.METHOD : 指定该策略的Annotation只能修饰方法定义。
ElementType.PACKAGE : 指定该策略的Annotatio只能修饰包定义。
ElementType.PARAMETER : 指定该策略的Annotation可以修饰参数。
ElementType.TYPE : 指定该策略的Annotation可以修饰类、接口或枚举定义。
同样的,写法同@Retention类似,可以写明value,也可以直接写策略值。
@Documented : 指定被修饰的Annotation将被javadoc工具提取成文档。
@Inherited : 指定被修饰的Annotation将具有继承性,被@Inherited修饰的Annotation再修饰某个类,则该类的子类同时会带上这个被Inherited修饰的Annotation。
3、自定义Annotation
定义Annotation : 定义一个新的Annotation,使用@interface关键字。代码如下:

public @interface Test {

}

@interface定义的自定义Annotation中可以声明多个成员变量

public @interface MyTag {
	String name();
	int age();
}

一旦在自定义的Annotation中定义了成员变量,就需要为成员变量赋值,赋值方式如下:

@MyTag(name = "xx", age = 6)
public void info() {
}

或则在自定义Annotation中为成员变量指定默认值,则使用该Annotation时可以不为这些成员变量指定值,而是使用默认值。默认值方式如下:

public @interface MyTag {
	String name() default "yeeku";
	int age() default 32;
}

提取Annotation信息
java5中提供了java.lang.reflect中AnnotatedElement接口。这里需要一提的是由于所有注解在不使用@Retention修饰或者使用了之后没有使用@Retention(RetentionPolicy.RUNTIME)修饰时,注解将可能在JAVA程序运行时去除掉,或者在编译时就去除掉了。这里需要对将需要提取Annotation信息的注解增加@Retention(RetentionPolicy.RUNTIME)。这样程序在装载时,注解才是可见的。
AnnotatedElement是所有程序元素的父接口,所以,可以使用AnnotatedElement来获取程序元素上的Annotation信息。提供方法如下:
getAnnotation(annotationClass) : 返回该程序上存在的指定类型的注解。如果该注解不存在,则返回null。
getDeclaredAnnotation : 尝试获取直接修饰该程序元素、指定类型的Annotation。如果该类型的注解不存在,则返回null。
getAnnotations : 返回该程序元素上存在的所有注解。
isAnnotationPresent(annotationClass) : 判断该程序元素上是否存在指定类型的注解,如果存在则返回true,否则返回false。
getAnnotationsByType(annotationClass) : 返回该程序元素上的所有指定类型的注解。
getDeClaredAnnotationByType(annotationClass) : 返回该程序元素上直接修饰的指定类型的注解。
使用Annotation :
标记Annotation/元Annotation
反射方式,获取Annotation中的数据
JAVA8新增的重复注解 :
java8以前,同一个程序元素前最多只能使用一个相同类型的Annotation。如果硬要写多个相同类型的注解,只能使用Annotation容器。注解默认是不能作为重复注解使用的,在java8中可以开发专门需要写重复注解的Annotation。
重复注解容器定义方式,需要先定义好容器注解,定义方式如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FkTags {
	FkTag[] value();
}

这里需要注意的是,这个容器注解的生存周期一定要比待修饰的注解长。否则会提前被丢弃掉。并且内部的FkTag就是待修饰的注解。
重复注解定义方式就是在正常的注解上加上@Repeatable(FkTags.class)
JAVA8新增的TypeAnnotation:
JAVA8为ElementType增加了TYPE_PARAMETER、TYPD_USE两个枚举值。Type Annotation可以在任何用到类型的地方使用。使用类型注解可以校验任何程序元素的类型等操作,这些操作JAVA8并没有帮我们实现,我们可以自己通过反射实现。
编译时处理Annotation:
APT(Annotation Processing Tool)是一种注解处理工具,它对源代码文件进行检测,并找出源文件中所包含的Annotation信息,然后针对Annotation信息进行额外的处理。
javac.exe工具提供了一个-processor选项,这个选项将可以指定一个Annotation处理器。这个Annotation处理器会在编译时提取并处理Java源文件中的Annotation。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值