Scala 注解

2019-05-09 11:54:42 | 编辑 | 添加

在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
  (RetentionPolicy.RUNTIME)

所有需要以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.

该注解起到了标记的作用。使用该注解的成
  员不应生成对应的bean 信息

StaticAnnotation

静态字段@Target(ElementType.
  TYPE)

对于任何注解而言,如果该注解希望能够跨
  编译单元可见并定义“静态”的元数据,那
  么它需要将StaticAnnotation 特征作为其父
  特征

TypeConstraint

N.A.

TypedConstraint 是一个注解trait,它可以作
  用于一些为类型定义约束的trait 之上。无需
  使用定义或使用类型时的外部信息,仅依靠
  类型自身所提供的信息,TypedConstraint 便
  能完成其工作。编译器会利用这一限制对约
  束进行重写

unchecked

类似于
  @SuppressWarnings("unchecked")

unchecked 是一个标记注解,我们可以将其
  用于match 语句的选择器( 例如:x match
  {...} 中的x)中。假如match 语句中的case
  表达式不能覆盖“所有可能”,unchecked 注
  解会阻止编译器抛出警告

 

2.继承自StaticAnnotation的Scala注解

注解名

Java中对应的注解

描  述

BeanProperty

JavaBean convention

该注解可以用作字段标记(构造器参数中使用val
  关键字和var 关键字),编译器因此生成JavaBean
  格式的getter 和setter 方法。编译器只会对使用var
  声明的变量生成setter 方法。请参考22.3 节的相关
  讨论

BooleanBeanProperty

same

与BeanProperty 类似, 不同的地方在于
  BooleanBeanProperty 的getter 方法名是isX,而不
  是getX

cloneable

java.lang.Cloneable(interface)

起到类标志的作用,表明该类可以被克隆

compileTimeOnly

N.A.

编译结束后,这类注解项便不再可见。例如:这类
  注解项可用在宏中,当对宏执行完扩展操作后,这
  些注解项便消失了

deprecated

java.lang.Deprecated

deprecated 注解可以用在任何类型的定义体上。它
  表明该“定义”项已经过时。使用该定义项时,编
  译器会抛出警告信息

deprecatedName

N.A.

deprecatedName 注解标注了参数名已经过时。由于
  调用代码会使用过时的参数名,因此该注解是需要
  的。例如val x = foo(y = 1)

elidable

N.A.

用于阻止代码生成。例如,该注解可以用于阻止产
  生不需要的日志消息

implicitNotFound

N.A.

定制无法找到隐式值时的错误消息

inline

N.A.

用作方法标志,当看到某个方法使用了inline 注解
  时,编译器应该“尽力”将该方法内联(inline)

native

native ( 关键字)

native 注解对方法进行标注,表明该方法会使用
  “本地”方法实现。编译器不会负责生成该方法的
  方法体,不过使用该方法时会执行类型检查

noinline

N.A.

noinline 是一个方法标志,它能够阻止编译器对被
  标注方法进行内联(inline),即使对该方法执行内
  联操作看上去是安全的

remote

java.rmi.Remote(interface)

该注解用作类标志,表明该类应该允许远程JVM
  调用

specialized

N.A.

作用于参数化类型和参数化方法中的类型参数。该
  注解要求编译器根据平台原始类型生成其对应的
  AnyVal 方法或类型时,对生成的代码进行优化。你
  还能选择是否对生成的特化实现的AnyVal 类型进行
  限定

strictfp

strictfp (keyword)

严格执行浮点语义

switch

N.A.

switch 注解作用于match 表达式中, 例如(x:@
  switch) match {...}。当出现switch 注解时,编译
  器会检查该match 语句是否已经被编译成某个基于
  表或可查找的switch 语句。假如验证失败,意味着
  该switch 语句被编译成了一组条件判断语句。由于
  该组条件语句效率低下,编译器会抛出错误

tailrec

N.A.

tailrec 是一个方法类注解,它要求编译器对该方
  法进行验证,确认编译该方法时使用了尾调用优化
  (tail-call optimization)。当出现tailrec   注解时,假
  如该方法无法被优化到一个循环内,那么编译器将
  抛出错误。假如使用了tailrec 注解的方法是可重
  写的,由于该方法不是private 或final 方法,编
  译器也会抛出错误

throws

throws (keyword)

该注解用于对方法进行标注,它描述了被标注的方
  法可能会抛出的异常。详细信息请参考后续文章的
  相关内容

transient

transient (keyword)

用于对字段进行标注,表示该字段是瞬态的(即非
  持久化的)

unchecked

N.A.

限制编译器执行检查,如检查match 表达式是否
  完整

uncheckedStable

N.A.

uncheckedStable 用于对值进行标记。被标记的值即
  使是可变类型,也会被视为是稳定的

uncheckedVariance

N.A.

可用于可变类型参数的注解。你也可以对类型化参
  数使用该注解,以关闭型变检查

unspecialized

N.A.

对特化类型生成进行限制

varargs

N.A.

如果被修饰的方法中包含了一些重复的参数,那
  么考虑互操作性,编译器会为其生成Java 风格的
  varargs 方法

volatile

volatile (keyword, for fields
  only)

可用于某一单独字段,表明可能会有某个单独的线
  程对该字段进行修改。你也可以对整个类型施加
  该注释,这样一来,该类型的所有字段都会受到
  影响

 

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 {}