4

我注意到 2.9.0-1 中的这种破坏(对我来说与 OGNL 一起使用)变化:

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

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(为什么我不知道)。

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

4

1 回答 1

3

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

于 2011-07-21T23:50:09.820 回答