使用 Scala 搜索方法中的注释

发布于 2024-12-09 08:14:55 字数 701 浏览 1 评论 0原文

以下代码无法编译(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 })
}

有没有办法实现带注释的成员的运行时反射?

The following code fails to compile (Output is not of type 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 })
}

Is there any way to achieve runtime reflection on the annotated members?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沉鱼一梦 2024-12-16 08:14:55

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

(java 等效项:x.getClass <=> x.getClass().classOf[X] <=> X.classx.getClass x.GetType()。 > <=> typeof(X))

Your Block.getClass should be classOf[Block]. getClass works on instances.

(java equivalent: x.getClass <=> x.getClass(). classOf[X] <=> X.class. C# equivalent: x.getClass <=> x.GetType(). classOf[X] <=> typeof(X))

心的憧憬 2024-12-16 08:14:55

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

import java.lang.annotation.*;

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

It seems there is no way to achieve this in Scala (yet), and thus we should resort to using a Java class as such:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Output {
    public String value();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文