在Scala 中,注解的使用并不如Java 语言中注解出现得那么频繁,不过它们还是有用的。Scala 使用注解实现了一些Java 关键字(如strictfp、native 关键字)。Scala 代码还能使用Java 注解。如果愿意,你可以使用Spring 框架或Guice 框架中的注解实现依赖注入。
Scala 的注解都继承自scala.annotation.Annotation类型。那些直接继承自该抽象类的注解无法被系统保留, 因此类型检查器无法使用这些注解, 而运行时也无法调用它们。但有两个主要的Annotation 子类型(trait) 突破了这些限制。继承自scala.annotation.ClassfileAnnotation 的注解将作为Java 注解存储在类文件中, 而继承自scala.annotation.StaticAnnotation(的注解则允许类型检查器对其进行访问,即使是需要跨编译单元,它也允许类型检查器对其访问。下面整理列出scala所有注解列表大全以及和java注解的对照。
1.继承了Annotation类型的Scala注解
注解名 | Java中对应的注解 | 描 述 |
ClassfileAnnotation | Annotate with@Retention | 所有需要以Java 注解的形式存储在类文件中,以供运行时访问的注解都应该继承ClassfileAnnotation 这一trait |
BeanDescription | BeanDescriptor (class) | 该注解可用于JavaBean 类型或成员,它会为修饰的类型或成员附加上一条简短的描述信息(以注解参数的方式提供),当生成bean信息时,这条简短的描述信息将会被包含在bean 信息中 |
BeanDisplayName | BeanDescriptor (class) | 该注解可用于JavaBean 类型或成员,它会为修饰的类型或成员附加上名称(以注解参数的方式提供),当生成bean 信息时,该名称将会被包含在bean 信息中 |
BeanInfo | BeanInfo (class) | 该注解起到了标记的作用,凡是使用了这一注解的Scala 类都应该为其生成一个BeanInfo类。在BeanInfo 类中,val 变量被生成为只读属性,var 变量被生成为读写属性,而def 变量则被生成为函数 |
BeanInfoSkip | N.A. | 该注解起到了标记的作用。使用该注解的成 |
StaticAnnotation | 对于任何注解而言,如果该注解希望能够跨 | |
TypeConstraint | N.A. | TypedConstraint 是一个注解trait,它可以作 |
unchecked | 类似于 | unchecked 是一个标记注解,我们可以将其 |
2.继承自StaticAnnotation的Scala注解
注解名 | Java中对应的注解 | 描 述 |
BeanProperty | JavaBean convention | 该注解可以用作字段标记(构造器参数中使用val |
BooleanBeanProperty | same | 与BeanProperty 类似, 不同的地方在于 |
cloneable | java.lang.Cloneable(interface) | 起到类标志的作用,表明该类可以被克隆 |
compileTimeOnly | N.A. | 编译结束后,这类注解项便不再可见。例如:这类 |
deprecated | java.lang.Deprecated | deprecated 注解可以用在任何类型的定义体上。它 |
deprecatedName | N.A. | deprecatedName 注解标注了参数名已经过时。由于 |
elidable | N.A. | 用于阻止代码生成。例如,该注解可以用于阻止产 |
implicitNotFound | N.A. | 定制无法找到隐式值时的错误消息 |
inline | N.A. | 用作方法标志,当看到某个方法使用了inline 注解 |
native | native ( 关键字) | native 注解对方法进行标注,表明该方法会使用 |
noinline | N.A. | noinline 是一个方法标志,它能够阻止编译器对被 |
remote | java.rmi.Remote(interface) | 该注解用作类标志,表明该类应该允许远程JVM |
specialized | N.A. | 作用于参数化类型和参数化方法中的类型参数。该 |
strictfp | strictfp (keyword) | 严格执行浮点语义 |
switch | N.A. | switch 注解作用于match 表达式中, 例如(x:@ |
tailrec | N.A. | tailrec 是一个方法类注解,它要求编译器对该方 |
throws | throws (keyword) | 该注解用于对方法进行标注,它描述了被标注的方 |
transient | transient (keyword) | 用于对字段进行标注,表示该字段是瞬态的(即非 |
unchecked | N.A. | 限制编译器执行检查,如检查match 表达式是否 |
uncheckedStable | N.A. | uncheckedStable 用于对值进行标记。被标记的值即 |
uncheckedVariance | N.A. | 可用于可变类型参数的注解。你也可以对类型化参 |
unspecialized | N.A. | 对特化类型生成进行限制 |
varargs | N.A. | 如果被修饰的方法中包含了一些重复的参数,那 |
volatile | volatile (keyword, for fields | 可用于某一单独字段,表明可能会有某个单独的线 |
3.Scala meta注解
注解名 | 描述 |
beanGetter | 对@BeanProperty 注解进行限制,使其只出现在生成的getter 方法中(例如字段x 生成的getX 方法) |
beanSetter | 对@BeanProperty 注解进行限制,使其只出现在生成的setter 方法中 |
companionClass | Scala 编译器会为对应的隐式类生成隐式转换方法 |
companionMethod | 与companionClass 注解相似,不过companionMethod 会同时将该注解功能应用到生成的转换方法上 |
companionObject | 创建companionObject 的本意是希望将其用到自动生成的伴生对象的case 类中。现在看来,该注解没有什么作用 |
field field | 可用于那些指定默认目标的注解定义中,这里的默认目标专指字段。我们可以使用该表之前提及的注解对默认目标进行覆写getter 与filed 相似,不过只提供了getter 方法 |
languageFeature | 用于提供scala.language 包中定义的语言功能 |
param | 与field 相似,不过只提供了param 方法 |
setter | 与field 相似,不过只提供了setter 方法 |
4.Scala 定义注解
在Scala 中定义注解并不需要使用Java 类似的特殊语法,下面列出implicatNotFound 的实现
代码:
package scala.annotation final class implicitNotFound(msg: String) extends StaticAnnotation {}