以下代码无法编译(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 })
}
有没有办法在带注释的成员上实现运行时反射?
答案 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();
}