Java @AutoAnnotation的作用是什么?怎么用呢??

Java @AutoAnnotation的作用是什么?怎么用呢??,java,android,annotations,dagger-2,Java,Android,Annotations,Dagger 2,在中,我读到了@AutoAnnotation。它提到了 这一点也在本文中提到 我读到了,无法理解 我通过我的Android代码使用 implementation 'com.google.auto.value:auto-value:1.5.2' kapt 'com.google.auto.value:auto-value:1.5.2' 而且 android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCo

在中,我读到了@AutoAnnotation。它提到了

这一点也在本文中提到

我读到了,无法理解

我通过我的Android代码使用

implementation 'com.google.auto.value:auto-value:1.5.2'
kapt 'com.google.auto.value:auto-value:1.5.2'
而且

android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
但我不明白怎么用它。有使用它的好教程吗?

自动生成一个类,该类以JDK相同的方式实现注释接口

匕首地图键 当通过Dagger使用使用自定义注释作为密钥的多绑定映射时,Dagger将使用注释实例本身作为密钥,将实例
T
或提供程序
Provider
安装到返回的映射中。为了更清楚地说明这一点:

@MapKey
@接口注释{
字符串foo();
}
@提供@YourAnnotation(foo=“bar”)YourClass getYourClassForBar(){/*…*/}
//Dagger将创建一个多重绑定,允许您注入以下内容:
@注入地图;
如果这里唯一重要的是
foo
,那么您也可以使用
unwrapKeys
使地图由字符串而不是注释设置关键帧,但假设您希望这样做,因为您希望注释将来具有多个值。但是注释的实现从何而来,您应该如何调用地图上的
get

运行时的注释 当您注释Java元素(通常是类、方法或字段)时,Java将返回该类注释的特定实现。从:

@接口类序言{
字符串作者();
字符串date();
int currentRevision()默认值为1;
字符串lastModified()默认为“不适用”;
字符串lastModifiedBy()默认为“不适用”;
//注意数组的用法
字符串[]审阅者();
}
// [...]
@类序言(
作者=“约翰·多伊”,
日期=“3/17/2002”,
当前版本=6,
lastModified=“4/12/2004”,
lastModifiedBy=“Jane Doe”,
//注意数组表示法
评论员={“爱丽丝”、“鲍勃”、“辛迪”}
)
公共类Generation3List扩展了Generation2List{/*…*/}
在这种用法中,Generation3List有一个ClassPremission类型的注释。如果注释在运行时保留(即类序言本身保留),则可以通过或访问它。(还有一些声明的副本以不同的方式处理超类注释。)

一旦找到ClassPreamble的实例,就可以使用
author()
date()
等方法从类中检索数据。然而,ClassPreamble的行为就像一个接口,并且该注释的实现是VM内部的。这使得在运行时创建自己的ClassPreamble任意实例变得更加困难

一致性注释实现 因为注释和类序言是接口,所以可以创建一个实现。然而,与虚拟机的实现相比,该实现不太可能有
equals
hashCode
的匹配实现,因为JRE之间的实现可能不同,Android中的实现也可能不同。然而,
equals
hashCode
的实现实际上是非常严格的:

注释的哈希代码是其成员(包括具有默认值的成员)的哈希代码之和,定义如下:注释成员的哈希代码是(由String.hashCode()计算的成员名称哈希代码的127倍)XOR成员值的哈希代码,定义如下[…]

如果指定的对象表示逻辑上等同于此对象的注释,则返回true。换句话说,如果指定对象是与此实例具有相同注释类型的实例,且其所有成员都等于此注释的相应成员,则返回true,如下所述[…]

手动实现这些规则是可能的,但这样做会很困难,而且如果注释或类序言的结构发生变化,也会带来负担。尽管如此,AutoAnnotation会自动为一致性实现生成代码:

公共类注释{
@自动批注公共静态YourAnnotation YourAnnotation(字符串foo){
返回新的自动批注\u YourAnnotations\u yourAnnotation(foo);
}
}
公共类序言{
@自动注释公共静态类序言类序言(
字符串作者,
字符串日期,
int当前修订版,
字符串lastModified,
字符串lastModifiedBy,
字符串[]审阅者){
返回新的自动注释\u类前导码\u类前导码(
作者
日期,
当前版本,
最后修改,
最后修改,
审查员);
}
}
使用AutoAnnotation的生成实现,您可以在Dagger Multibindings生成的映射上调用
get
(或提供您控制的测试实现),而无需处理特定于注释的
hashCode
XOR或
equals
规则。这在Dagger和测试之外很有用,但因为Dagger在其映射中使用注释实例,所以您可能需要使用AutoAnnotation来创建类似的实例是有意义的。

自动生成一个类,该类以JDK相同的方式实现注释接口

匕首地图键 当通过Dagger使用使用自定义注释作为密钥的多绑定映射时,Dagger将使用注释实例本身作为密钥,将实例
T
或提供程序
Provider
安装到返回的映射中。为了更清楚地说明这一点:

@MapKey
@接口注释{
字符串foo();
}
@提供@YourAnnotation(foo=“bar”)YourClass getYourClassForBar(){/*…*/}
//Dagger将创建一个多重绑定,允许您注入以下内容:
@注入地图;
如果这里唯一重要的是
foo
,那么您也可以