Динамический прокси с использованием Scalas нового динамического типа - PullRequest
6 голосов
/ 03 марта 2011

Можно ли создать AOP-подобный перехватчик, используя новую функцию Scalas Dynamic Type?Например: возможно ли создать общий перехватчик секундомера, который можно смешивать с произвольными типами для профилирования моего кода?Или мне все равно придется использовать AspectJ?

Ответы [ 3 ]

5 голосов
/ 04 марта 2011

Я почти уверен, что Dynamic используется только в том случае, если объект, на котором вы выбираете, еще не имеет того, что вы выбираете:

Из ночной скаладок :

Экземпляры x этой черты разрешают вызовы x.meth (args) для произвольных имен методов meth и args списков аргументов. Если вызов не поддерживается в x , он переписывается в x.invokeDynamic ("meth", args)

Обратите внимание, что поскольку документация была написана, метод имеетбыл переименован applyDynamic.

2 голосов
/ 04 марта 2011

Нет.

Чтобы динамический объект был предоставлен в качестве параметра, он должен иметь ожидаемый тип - что означает наследование от класса, который вы хотите прокси или от соответствующего суперкласса./ interface.

Как только вы сделаете это, в нем будут статически предоставлены соответствующие методы, поэтому applyDynamic никогда не будет учитываться.

1 голос
/ 04 марта 2011

Я думаю, ваши шансы плохие.Scala будет вызывать applyDynamic, только если в вызове метода нет статического соответствия:

class Slow {
  def doStuff = //slow stuff
}
var slow = new Slow with DynamicTimer
slow.doStuff

В приведенном выше примере scalac не будет вызывать applyDynamic, потому что он статически разрешил ваш вызов doStuff.Он будет применен к applyDynamic, только если метод, который вы вызываете, не соответствует ни одному из имен методов типа.

...