使用Scala搜索方法中的注释

时间:2011-10-10 15:31:23

标签: scala annotations

以下代码无法编译(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 个答案:

答案 0 :(得分:1)

您的Block.getClass应为classOf[Block]getClass适用于实例。

(等效的java:x.getClass&lt; =&gt; x.getClass()classOf[X]&lt; =&gt; X.class。等效的C#:x.getClass&lt; = &gt; x.GetType()classOf[X]&lt; =&gt; typeof(X)

答案 1 :(得分:1)

似乎在Scala中还没有办法实现这一点,因此我们应该使用Java类:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Output {
    public String value();
}