Scala的注解其实就是在编译时进行一些特殊的操作,很多是针对Java的概念提出的。简单的说,注解就是普通的类、变量、方法等,不过能让编译器支持特殊的操作。
注解通常使用的场景是类、方法、字段、局部变量和参数等。
类注解,如:
@Entity class AccessLog
构造器注解,如:
// 给主构造器添加注解时,需要将注解放置在构造器之前,并加上一对圆括号
class AccessLog @Inject() (var ip: String, var id: String)
变量注解,如:
@BeanProperty var macId = _
方法注解,如:
@tailrec
private def submit(args: SparkSubmitArguments, uninitLog: Boolean): Unit = {}
参数注解,如:
def submit(@NotNull arg: SparkSubmitArguments) {}
// 类型参数注解
class doRun[@specialized T]
表达式注解 ,如:
// 表达式后有冒号,然后是注解
(argsMap.get(key) : @unchecked) match {}
自定义注解,需要扩展Annotation trait,如:
class Access extends annotation.Annotation
@Access
class WifiAccess(var ip:String)
或者
class Access(var ip:String) extends annotation.Annotation
常见注解:
注解 | 解释 |
@BeanProperty | 标记生成JavaBean风格的getter和setter方法 |
@BooleanBeanProperty | 标记生成is风格的getter方法,用于boolean类型的field |
@NotNull | 标记不为空 |
@volatile | 标记为JVM中volatile的字段,可以被多个线程同时更新 |
@transient | 标记为JVM中transient字段,该字段不会被序列化 |
@throws | 标记给方法要抛出checked异常 |
@tailrec | 尾递归。递归调用有时候能被转化成循环,能节约栈空间 |
@varargs | 标记方法接收的是变长参数 |
@SerialVersionUID | 标记指定可序列化类的序列化版本 |
@native | 标注用C,C++实现的方法 |
@strictfp | 标记为精确浮点,确保浮点数运算的准确性 |
@switch | 标记跳转表生成与内联 |
@inline | 标记编译器内联 |
@noinline | 标记编译器不要内联 |
@elidable | 标记方法可以省略,编译时不会生成代码 |
@deprecated | 标记方法弃用,让编译器生成警告提示 |
@deprecatedName | 标记弃用的参数名,让编译器生成警告提示 |
@unchecked | 标记匹配不完整时取消警告提示 |
@uncheckedVariance | 标记取消与型变相关的错误提示 |
@implicitNotFound | 标记如果隐式转换类型不存在,生成错误提示 |
@cloneable | 标记可被克隆对象 |
@remote | 标记可被远程连接的对象 |
@specialized | 标记让编译器自动生成方法 |