Методы в свойстве становятся изменчивыми методами при смешивании с конкретными классами в 2.9.0-1, но не в 2.8.1.

Я заметил это критическое (для меня, использующего его с 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 (почему я не знаю) в своих выражениях.

Итак, мой вопрос; Почему было внесено это изменение?


person andreak    schedule 21.07.2011    source источник
comment
getKnoll и getKnall просто опечатка?   -  person agilesteel    schedule 21.07.2011
comment
Нет, getKnoll - это смешанный метод, который становится нестабильным, и мне интересно, почему.   -  person andreak    schedule 21.07.2011


Ответы (1)


Нет такой вещи, как изменчивый метод. Вы видите, что установлен флаг 0x0040, то есть ACC_VOLATILE для полей и ACC_BRIDGE для методов. Поскольку метод Modifier.isVolatile принимает значение Int, он не может сказать вам, что то, о чем вы спрашиваете, не имеет смысла.

person psp    schedule 21.07.2011
comment
Почему методы с body в типажах становятся мостовыми методами в scala-2.9, чего не было в 2.8? Или это еще один ТАК вопрос? - person andreak; 22.07.2011