Android APT 系列 (二):APT 筑基之注解

这是我参与更文应战的第 7 天,活动概略查看: 更文应战

前语

很快乐遇见你~

在本系列的上一篇文章中,咱们对反射一些常用的知识进行了阐明,还没有看过上一源码之家篇文章的朋友,建议先去阅读 Android APT 系列 (一):APkotlin极简教程T 筑基之反射。接下来咱们看下 Java 注解

Github Demo 地址 , 咱们能够变量泵看 Demo 跟从我的kotlin面试题思路一起分析

一、注解介绍

1)、什么是注解?

要阐明注解咱们首先要理解什么是元数据:元数枚举类型 java据便是为其他数据供给信息的数据

那么仍是引进官方一段对注解的阐明:注解用于为代码源码供给元数element滑板据。作为元数据,注解不直接影响你的代码实施,但也有一些类型的注解实枚举类型 java源码年代上能够用于这变量类型有哪些一意图。Java 注解是从 JDK 1.5 开始增加到kotlin怎样读 Java 的。

简略的了解:注解便是附加到代码上的一种额定弥补信息

2)、注解有哪些作用?

源码阶段注解: 编译器可运用该阶段注解检测过错,提示正告信息,打印日志等

编译阶段注解:运用注解信息主动生成代码、文档或许做其它相应的主动处理

作业阶段注解: 可经过反射获取注解信息,做相变量的界说应操作

3)、怎样自界说界说一个注解?

运用 @interface + 注解称号这种语法结构就能界说一个注解,如下:

@interface TestAnnotation{
}

一般变量咱们会运用一些元注解来润饰自界说注解

二、元注解

了解了之前的元数据,元注解便是为注解供给注解的注解 ,这句话或许有点绕,反正你清楚元注解是给注解用的就行了

JDK 给咱们供给的元注解有如下几个:

1、@Target

2、@变量是什么意思Retent枚举类型是根本类型吗ion

3、@Inhe变量的指针其意义是指该变量的rited

4、@Documented

5、@Repeaelementary是什么意思table

1)、@Target

@Target 标明这个注解能放在源码什么方位上,详细选择的方位列表如下:

ElementType.ANNOTATION_TYPE //能润饰注解
ElementType.CONSTRUCTOR //能润饰结构器
ElementType.FIELD //能润饰成员变量
ElementType.LOCAL_VARIABLE //能润饰局部变量
ElementType.METHOD //能润饰办法
Elementelementary schoolType.PACKA枚举类型中的元素都具有一个整型值GE //能润饰包名 
ElementType.PARAMETER //能润饰参数
ElementType.TYPE //能润饰类、接口或枚举类型
ElementType.TYPE_PARAMETER //能润饰泛型,如泛型办法、泛型类、泛型接口 (jdk1.8参与)
ElementType.TYPE_USE //能润饰类型 可用于恣意类型除了 class (jdk1.8参与)
@Target(ElementType.TYPE)
@interface TestAnnoelement是什么牌子tati源码编辑器编程猫on{
}

留神:默许状况下无限制

2)、@Retention

@Retention 标明注解的的生命周期,可选的值有 3 个:

RetentionPolicy.SOelements翻译URCE //标明注解只在源码中存在,编译成 class 之后,就没了
RetentionPolicy.CLASS //标明elements翻译注解在 java 源文件编程成 .变量类型有哪些class 文件后,仍然element滑板存在,可是作业起来后就没了
RetentionPolicy.RUNTIME /枚举类型是什么意思/标明注解在作业起来后仍然存在,程序能够经过反射获源码码头取这些信息
@Retention(RetentionPoli变量与函数cy.RUNTIME)
@inte源码编辑器rface TestAnnotation{
}

留神:默许状况下为 RetentionPolicy.CLASS

3)、@Inhelementserited

@Inherited 标明该注解可被承继,即当一个子类承继一个父类,该父类增加的注解有被 @Inherited 润饰,那么子类就能够获取到该注解,不然获elementanimation取不到

@Inher源码本钱ited
@interface TestAnnotation{
}

留神:默许状况下为不枚举类型enum可承继

4)、@Documented

@Document变量的拼音ed 标明该注解在经过 javadoc 指令生成 Api 文档后,会呈现该注解的注释阐明

@Documented
@interface TestAnnot枚举类型是根本类型吗ation{
}

留神:默许状况下为不呈现

5)、@Repeatable

@Repeatable 是 JDK 1.8 新增的元注解,它枚举类型中的元素都具有一个整型值标明注解在同一个方位能呈现多次,这个注解有点笼统,咱们经过一个实践比方了解一下

//游戏玩家注解
@Inherited
@Documentekotlin中心编程d
@Retention(RetentionPol变量名ickotlin面试题y.RUNTIME)
@Target(ElementType.ElementTYPE)
@i变量是什么意思nterface GamePlayekotlin中心编程r{
Ga枚举类型是什么意思me[] valu枚举类型是什么意思e();
}
//游戏注解
@Inherited
@Documented
@Retention(Rete枚举类型 javantionPolicy.RUNTI枚举类型是根本类型吗ME源码交易网站源码)
@Target(ElementType.TYPE)
@Repeatable(GamePlayer.class)
@interface Game{
String gameN源码本钱ame()kotlin和java;
}
@Game(gameName = "Ckotlin中心编程F")
@Game(gameName = "LOL")
@Game(game源码本钱Name = "DNF")
cl枚举类型 c言语ass GameTest{
}

留神:默许状况下不行重复

阅历:一般状况下,咱们会运用多个元注解组合来润饰自界说注解

三、注解特征

1)、注解特征类型

注解特变量值色类型能够为以下的一些类型:

1、底子数据类型

2、String

3、枚举类型

4、注解类型

5、Clas变量的拼音s 类型

6、以上类型的一维数组类型

2)、界说注解特征

首先咱们界说一些注解特征,如下:

@Inherited
@Doc枚举类型的用法umenteelementary schoold
@Retention(RetentionPolicy.RUNTIME)
@Target(Elkotlin极简教程ementType.TYPE)
@iElementnelement滑板terface TestAnn枚举类型中的元素都具有一个整型值otation{
//这便是注解特征的语法结构
//界说一个特征并给了默许值
String name() default "e源码之家rdai";
//界说一kotlin实战个特征未给默许值
i变量名nt age();
}

或许你会有些疑问:这难道不是在界说办法吗?还能够给默许值?

这些疑问先留着,咱们继源码年代训练怎样样续分析

自界说注解默许都会承继 Annotation ,Annotation 是一个接口,源码如下elementary

public interface Annotation {
boolean equals(Object obj);
int hashCode();枚举类型 c言语
String to枚举类型是根本类型吗String();
Class<? extends Annotation> annotationType();
}

咱们知道,在接口中能够elementary界说特征和办法,那么作为自界说注解,是否也能够界说呢?

能够,接口中枚举类型是什么意思的特征默许都是用publ变量与函数ic static final 润饰的,默许是一个常量,关于自界说注解来说,这点没有任何差异。而接口中elementary的办法其实就相当枚举类型于自界说注解的特征,只不过自界说注解还能够给默许值。因而咱们在学习自定element是什么牌子义注解特征时,咱们应该把它当作一个新知识,加上我刚才对接口的分析对比,你上面的那些疑问便能够便elementary利的解决了

3)、注解特征运用

1、在运用注解的后边接element什么意思上一对括号,括号里面运源码编辑器编程猫特征名 = value 的格式,多个特征之间中kotlin极简教程间用 ,离隔

2、未给默许值的特征有必要进行赋值,不然编译器会报红

//单个特征
@TestAnnotation(age = 18)
class Test{
}
//多个特征
@Tes枚举类型是根本类型吗tAnnotation(age = 18,name = "erdai666")
class Test{
}

4)、kotlin和java注解特征获取

注解特征的获取可源码本钱以参看我的上一篇文章 传送门 ,上篇文章咱们讲的是经过类政策获取注解,咱们弥补点上篇文章没讲到的

1、咱们在获取特征的时分,能够先判别一下是否存在该注解,增elementui强代码kotlin教程的健壮性,如下:

@TestAnnotation(age = 18,name = "erdai666")
class Test{
}
Class<Test> testClass = Test.class;
//获取当源码之家时注解是否存在
boolean annotationPresent = testClass.isA变量值nnotationPresent(TestAnnotation.class);
//假设存elementary是什么意思在则进入条件体
if(aelementanimationnelementsnotationPresent){
TestAnnotation declaredAnnotatElemention = testClass.getDeclaredAnnotation(TestAnnotation.class);
System.out.println(declaredAnnotation.name());
Skotlin怎样读ystem.out.println(declaredAnnotakotlin实战tion.age());
}

2、获取类特征的注解特征

@Inherited
@Docu源码网站mented
@Retention(RetentionPolicy.RUNTIME)
@TElementarget(Elekotlin为什么盛行不起来mentType.FIELD)
@interface TestField{
String filed();
}
class Test{
@TestField(filed = "我是特征")
public String test;
}
//变量的拼音经过反射获取特征注解
Class<Test&枚举类型是根本类型吗gt; testClass1 = Test.class;
try {
Field field = testClass1.getDeclaredField("te源码st");
if(field.isAnnotationPresent(elements翻译TestField.cl变量值ass)){
TestFkotlin极简教程ield fieldAnnotation = field.getDecelement是什么牌子laredAnnotation(TestField.cl源码码头ass);
System.out.println(fieldAnnotation.filed());
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
//打印作用
我是特征

3、获取类办法的注解特征

@Inherited
@Documented
@Retention(RetentionPolicykotlin言语.RUNTIME)
@Target(ElementTyelement是什么牌子pe.变量与函数METHOD)
@inter变量值face TestMethod{
String met变量的界说hod();
}
class Test变量的界说{
@TestMethod(method = "我是办法")
public vo变量的界说id test(){
}
}
//经过反element什么意思射获取办法注解
Class<Test> testClass2 = Test.class;
try {
Method method = testClass2.g枚举类型的用法etDeclaredMethod("test");
if(metho枚举类型enum用法d.isAnnotationPresent(TestMethod.class)){
TestMethod methodAnnotatielementaryon = method.getDeclaredAnnotation(TestMethod.class);
System.out.println(methodAnnotation.method());源码年代训练怎样样
}
} catch (Exception e) {
e.prikotlin实战ntStackTkotlin面试题race();
}
//打印作用
我是办法

四、J变量泵DKkotlin面试题 供给的内置注解kotlin为什么盛行不起来

JDK 给咱们源码供给了许kotlin言语多内置的注解,其间常用的有:

)1、@Override

2、@Deprecated

3、@SuppressWarnings

4、@Fun源码年代训练怎样样ctionalInterface

1)、@Overrideelementanimation

@Override 用在办法上,标明这个办法重写了父类的办法,例如 toString 办法

@Ov枚举类型中的元素都具有一个整型值erride
public String toString() {
return枚举类型是什么意思 super.toSt变量与函数ring();
}

2)、@Deprecated

@Deprecated 标明这个办法被弃用,不建议开发者运用

Android APT 系列 (二):APT 筑基之注解

能够看到用 @Deprecated 注解的办法调用的时分会被划掉

3)、@SuppressWarning变量名s

@Suppre源码编辑器skotlin中心编程sWarnings 用于疏忽正告信息,常见的取值如下:

  • deprecation:运用了不赞成运用的类或办法时的正告(运用 @Deprecated 使得编译器产生的正告)
  • unchecked:实施了未查看的变量的指针其意义是指该变量的转化时的正告,例如当运用集结时没有用泛型 (Generics) 来指定集结保存的类型; 封闭编译器正告
  • fallthrough源码编辑器编程猫:当 Switch 程序块直接通往下一变量的拼音种状况而没有 Break 时的正告
  • path:在类途径、源文件途径等中有不存在的途径时的正告
  • serial:当在可序列化的类上短少 serialVersionUID 界说时的正告
  • finally:任何 finally 子句不能正常完kotlin极简教程成时的正告
  • rawtypes 泛型类型未指明
  • uelements翻译nused 引证界说枚举类型enum用法了,可是没有被运用
  • all:关于以上一切状况的正告

以泛型举个比方:

Android APT 系列 (二):APT 筑基之注解

当咱们创建源码编辑器编程猫 List 未指定泛型时,编译器就会报枚举类型中的元素都具有一个整型值黄提示咱们未指明泛型,这个时分就能够运用这个注解了:

Android APT 系列 (二):APT 筑基之注解

4)、@FunctionalInterface

@FunctionalInterface 是 JDK 1.8 新增的注解,用于约好函数式接口,枚举类型enum用法函数式接口便是接口中只有一个笼统办法

@Fu变量的拼音nctionalInterface
interface源码编辑器编程猫 t枚举类型是根本类型吗estInterface{
void testMethod();
}

而当你有两个笼统办法时,注解会报红提示你:

Android APT 系列 (二):APT 筑基之注解

五、注解实践运用场景

1)、运用自界说注解代替枚举类型

首要针对源码阶段注解

这个在咱们实践作业中也挺常用的,运用枚举类型开支大,咱们一般都会运用自界说注解进行代替,如下:

//1、运用枚举kotlin实战
enum EnumFontType{
ROBelement什么意思OTO_REGUL枚举类型界说AR,ROBOTO_MEDIUM,ROBOTO_BOLD
}
//实践调用
EnumFontType type1 = EnumFontType变量的指针其意义是指该变量的.ROBOTO_变量的拼音BOLD;
//================================ 完美的分割线 =========================element滑板=========
//2、运用自界说注解
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VelementsARI变量值ABLE})
@R枚举类型名的界说etent变量名的命名规矩ion(Retekotlin为什么盛行不起来ntionPolicy.SOURCE)
@IntDef({AnnotationFontType.ROBOTO_Rkotlin和javaEGULAR,AnnotationFonkotlin实战tType.ROBOTO_MEDIUM,AnnotationFontType.ROBOTO_BOLD})
@int枚举类型的用法erface AnnotationFontType{
int ROBOTO_REGULAR = 1;
int ROBOTO_MEDIUM = 2;
int ROBOTO_BOLD = 3;
}elementary是什么意思
//实践调用
@AnnotationFontType int type2 = Anno枚举类型 javatati枚举类型enumonFontType.ROBOTO_MEDIUM;

2)、注解处理器 (APT)

首要针对编译阶段注解

实践咱们日常开发中,经常会遇到它,因为咱们常用的一些开源库如 ButterKnife,elementsRetrofit,Arouter,EventBus 等等都运用到kotlin教程了 APT 技能。也正是因为这些闻名的开源库,才使得 APT 技能越来越火,在本elementary是什么意思系列的下一篇中,我也kotlin为什么盛行不起来会讲到。

3)、作业时注解处理

首要针对作业阶段注解

举个实践的比方:例如咱们开车去自助加油机加油,设定的 Money 是 200,elementary是什么意思假设少于 200 则提示 加油中...,不然提示 枚举类型的用法已加满,假设呈现反常状况,提示 加油失利

现在咱们经过注解来完成一下它,如下:

@In变量类型有哪些herited
@Docume枚举类型 c言语nted
@Retention(RetentionPolielements翻译cy.RUNTI源码之家ME)
@Target(Ele枚举类型名的界说mentType.METHOD)
@interfaceKotlin OilAnno枚举类型enum用法tation{
double maxOilMoney() default 0;
}
class GasStation{
@OilAnnotation(maxOilMoney = 200)
public void addOil(double money){
String tips = processOilAnnotation(money);
System.out.println(tips);
}
@SuppressWarnikotlin为什么盛行不起来ngs("all")
private String processOilAnnotation(double money){
try {
Class<GasStation> aClass = GasStation.kotlin面试题class;
//获取其时办法的注解
Method addOilMethod = aClass.getDeclaredMethod("addOi变量名的命名规矩l", double.class);
//获取办法注解是否存在
booleaelement什么意思n annotationPresent = addOilMethod.isAnnotationPresent(OilAnnotation.class);
if(annotationPres枚举类型enumentkotlin极简教程){
OilAnnotation oilAnnotation = addOilMetkotlin极简教程hod.getDeclaredAnnotation(OilA源码网站nnotation.claelementsss);
if(money >= oilAnnotation.maxOilMoney()){
return "油已加满";
}else {
re源码之家tu源码编辑器编程猫rn "加油中..源码年代.";
}
}
} catch (NoSuc枚举类型名的界说h枚举类型 javaMethodException e) {
e.printStackTrace();kotlin和java
}
return "加油失利";
}
}
new变量类型有哪些 GasStation().addOil(element是什么牌子100);
//打印作用
加油中...
new GasStation().addOil(200);
//打印作用
油已加满

六、总结

本篇文章讲的一些关键内容:

1、自界说注解时,元注解的组合运用

2、注解枚举类型界说特征的界说,运用和获取

3、一些常用的 JDK 内置注解

4、注解的实践kotlin教程运用及作业阶段注解源码是什么意思的一个实践

好了,本篇文章到这儿就结束了,希望能给你带来帮忙

感谢你阅读这篇文章

下篇预告

elements篇文章咱们kotlin为什么盛行不起来就正式开始 APT 技能的阐明了,敬请枚举类型kotlin怎样读待吧

参看和举荐

Java 注解完全解析

「Java 路程」| 注解(含 K枚举类型的用法otlin

变量的指针其意义是指该变量的文到此,原创不易,欢迎点赞,保藏,谈论和转发,你的认可是我创造的动力

欢迎注重我的 公 众 号,微信搜索 swe源码网站etying ,文章更新可第一时间收到

发表评论

提供最优质的资源集合

立即查看 了解详情