gpt4 book ai didi

reflection - 斯卡拉反射: getDeclaringTrait?

转载 作者:行者123 更新时间:2023-12-04 12:01:43 25 4
gpt4 key购买 nike

当我研究一个新的库时,我有时会发现很难找到一个方法的实现。

在 Java 中,Metho#getDeclaringClass 提供了声明给定方法的类。因此,通过迭代 Class#getMethods,我可以为每个方法找到声明它的类。

在 Scala 中,特征被转换为 Java 接口(interface),扩展特征的类将通过将特征的方法转发给静态定义这些方法的同伴类来实现特征的方法。这意味着 Method#getDeclaringClass 将返回类,而不是特征:

scala> trait A { def foo = {println("hi")}}
defined trait A

scala> class B extends A
defined class B

scala> classOf[B].getMethods.find(_.getName() == "foo").get.getDeclaringClass
res3: java.lang.Class[_] = class B

解决此问题的最佳方法是什么?意思是,给定一个类,我怎样才能得到一个 List[(Method, Class)] ,其中每个元组都是一个方法和它被声明的特征/类?

最佳答案

在 Scala 2.8 中,您可以使用 ScalaSigParser 解析 scala 特定的字节码信息。

这将比 scala 特征、类和方法的字节码序列化格式更稳定。

import tools.scalap.scalax.rules.scalasig._
import scala.runtime._

val scalaSig = ScalaSigParser.parse(classOf[RichDouble]).get
val richDoubleSymbol = scalaSig.topLevelClasses.head
val methods = richDoubleSymbol.children filter ( _ match {
case m : MethodSymbol => true
case _ => false
})

methods foreach println
richDoubleSymbol.isTrait
ScalaSigParser.parse(classOf[Ordered[Any]]).get.topLevelClasses.head.isTrait

打印:
scala> methods foreach println
MethodSymbol(x, owner=0, flags=20080004, info=23 ,None)
MethodSymbol(<init>, owner=0, flags=200, info=33 ,None)
[...]
MethodSymbol(isPosInfinity, owner=0, flags=200, info=117 ,None)
MethodSymbol(isNegInfinity, owner=0, flags=200, info=117 ,None)

scala> richDoubleSymbol.isTrait
res1: Boolean = false

scala> ScalaSigParser.parse(classOf[Ordered[Any]]).get.topLevelClasses.head.isTrait
res2: Boolean = true

我想按照这条路,您可以为 Scala 构建反射 API。

关于reflection - 斯卡拉反射: getDeclaringTrait?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1833762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com