首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反思Scala性状

反思Scala性状
EN

Stack Overflow用户
提问于 2012-10-27 14:52:56
回答 2查看 890关注 0票数 1

考虑一下这个例子

代码语言:javascript
复制
class FooListener extends Listener {
  @Listen
  def runMeToo = {
    ...
  }
}

trait Listener {

  @Listen
  def runMe = {
    ...
  }
}

我正在编写内省代码,以查找给定类的所有方法(即、FooListener、),并使用特定的注释(即@Listen)进行注释。在某些情况下他们会被调用。所以我需要他们所有的java.lang.Method实例。

在FooListener类中很容易找到这些方法。也很容易找到那些超类。

问题是如何找到从这些特征中继承下来的?以及这些特征的特征?等等..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-27 15:03:04

从特征继承的方法被复制到类中。所以只需列出类的方法就可以找到它们。

代码语言:javascript
复制
val ms = classOf[FooListener].getMethods()

然后用注解打印出来。

代码语言:javascript
复制
ms.foreach(m => m.getDeclaredAnnotations().foreach(a => println(m + " " + a)))

在我的例子中(用Test注释),这个输出

代码语言:javascript
复制
public void util.FooListener.runMe() @org.junit.Test(expected=class org.junit.Test$None, timeout=0)
public void util.FooListener.runMeToo() @org.junit.Test(expected=class org.junit.Test$None, timeout=0)
票数 1
EN

Stack Overflow用户

发布于 2012-10-27 15:05:34

由于特性在Java中被转换为接口,下面的代码片段应该可以工作:

代码语言:javascript
复制
val methods = classOf[FooListener].getInterfaces flatMap {intf =>
    intf.getMethods filter {_.getAnnotation(classOf[Listen]) != null}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13101235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档