当在2.9.0-1而不是2.8.1中混合使用混凝土类时,特性中的方法变为易变方法

时间:2011-07-21 09:51:09

标签: scala scala-2.8 volatile traits scala-2.9

我注意到这种打破(对我来说,使用它与OGNL)在2.9.0-1中的变化:

我发现,在2.9中,在类中声明的方法在类中混合时会变得易变:

2.9.0-1中的示例

import java.lang.reflect.Modifier

trait SuperTrait {
    def getKnoll = "Kanutten"
}

class KlassWithKnoll extends SuperTrait {
    def getKnall = "Mars"

}

val qsc = classOf[KlassWithKnoll]
val knollGetter = qsc.getDeclaredMethod("getKnoll")
println("isVolatile: " + Modifier.isVolatile(knollGetter.getModifiers()))

打印出来

isVolatile: true

但是在2.8.1:

打印出来

isVolatile: false

这对我来说实际上是一个重大变化,因为OGNL拒绝在其表达式中执行volatile(为什么我不知道)。

所以 - 我的问题是;为什么要做出这种改变?

1 个答案:

答案 0 :(得分:3)

没有易变的方法。你看到的是设置了0x0040标志,对于字段是ACC_VOLATILE,对于方法是ACC_BRIDGE。由于Modifier.isVolatile方法采用了Int,因此它无法真正告诉您所要求的内容没有意义。