Поиск аннотаций в методах с использованием Scala - PullRequest
1 голос
/ 10 октября 2011

Следующий код не компилируется (Output не относится к типу java.reflect.annotation.Annotation):

class Output(val name : String) extends Annotation

class Block {
  def outputs {
    for {
      method <- this.getClass.getMethods
      val a = method.getAnnotation(classOf[Output])
      if a != null
    } {
      println(a.name)
    }
  }
}

class Arithmetic[T: Numeric](val A: Connector[T], val B: Connector[T]) extends Block {
  @Output("Sum")        def Sum  = new Connector({ A.Value + B.Value })
  @Output("Difference") def Diff = new Connector({ A.Value - B.Value })
  @Output("Multiply")   def Mul  = new Connector({ A.Value * B.Value })
}

Есть ли способ добиться отражения во время выполнения над аннотированными элементами?

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Кажется, что в Scala нет способа достичь этого (пока), и поэтому мы должны прибегнуть к использованию Java-класса как такового:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Output {
    public String value();
}
1 голос
/ 10 октября 2011

Ваш Block.getClass должен быть classOf[Block]. getClass работает на экземплярах.

(эквивалент Java: x.getClass <=> x.getClass(). classOf[X] <=> X.class. C # эквивалент: x.getClass <=> x.GetType(). classOf[X] <=> typeof(X))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...