Java基础

2019-07-31-注解

2019-08-01  本文已影响0人  王元

1,源码注解仅仅在源代码层面上有效

2,在被编译成字节码的时候,已经被完全擦除了

3,仅仅是起到标记作用,保证代码的健壮性

一,注解的定义

@Interface声明会创建一个Java接口,与其他接口一样,注解也将会编译成.class文件,注解的元素声明实际上是方法声明,注解的方法没有参数,没有throws语句,也不能使用泛型

二,元注解

顾名思义,元注解就是定义和实现注解的注解,共五种:

元素类型 适用于
ANNOTATIONT_YPRE 注解类型声明
CONSTRUCTOR 构造函数
FIELD 实例变量
LOCAL_VARLABLE 局部变量
METHOD 方法
PACKAGE
PARAMETER 参数
TYPE 类(包含enum)和接口(包含注解类型)
TYPE_PARAMETER 类型参数
TYPE_USE 类型用途

同时支持多种类型的注解定义如下

@Target({ElementType.TYPE, ElementType.PACKAGE})
public @interface Media{
}

如果一个注解没有指定@Target类型,那么它可以用在除了TYPE_USE和TYPE_PARAMETER的其他类型中

注解范围 注解值 说明
源码级注解 @Retention(RetentionPolicy.SOURCE) 注解信息只保留到Java源码里
编译时注解 @Retention(RetentionPolicy.CLASS) 注解信息会保留到Java源码的.class文件里
运行时注解 @Retention(RetentionPolicy.RUNTME) Java虚拟机运行时也保留注解,可以通过反射读取注解的信息

未指定类型时,默认时ClASS类型

三,常见的标准注解

1,Override

2,Deprecated

3,SuppressWarnings

四,自定义注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Friut {
    enum Color { BLUE, RED, GREEN};
    /**
     * 水果颜色
     * @return
     */
    Color fruitColor() default Color.RED;
}

五,运行时注解

六,编译时注解

能够自动处理Java源文件,并且能够生成更多源码,配置文件,脚本或者其他可能想生成的东西
Java编译器集成了注解处理,通过在编译期间调用javac -processor命令调起注解处理器,它能够允许我们实现编译时注解功能,从而提高函数库的性能

1,定义注解处理器
注解处理器只能产生新文件,不能修改已经有的文件

2,注册注解处理器

手动执行上面的注册流程是很繁琐的,Google开源的Autoservices库,引入这个库之后,我们只需要@AutoService(Processor.class)就可以了

七,Android的apt插件

我们知道注解处理器只是在编译期间有效,到应用运行时不会用到,因此在gradle中引入依赖应该时provided而不是compile,语句如下:

当然我们也可以使用Android-apt插件的方式,它时一个Android studio引入注解处理器的一个辅助插件

只在编译期间引入注解处理器所在的的函数库作为依赖,不会大包到最终生成的Apk中

上一篇 下一篇

猜你喜欢

热点阅读