2

是否可以使用新的反射库显示保存在字节码中的完整类型签名(带有已擦除的参数化类型)?

例如类型

Any => Unit

应显示为

"scala.Function1<java.lang.Object,scala.runtime.BoxedUnit>"

因为这是存储在字节码中的类型。可以用 显示这种类型javap。第一个需要编译一些代码scalac

object X {
  def m(f: Any => Unit) = f
}

命令javap -c -s -l -verbose X$显示:

...
const #25 = Asciz   (Lscala/Function1<Ljava/lang/Object;Lscala/runtime/BoxedUnit;>;)Lscala/Function1<Ljava/lang/Object;Lscala/runtime/BoxedUnit;>;;
...
public scala.Function1 m(scala.Function1);
  Signature: (Lscala/Function1;)Lscala/Function1;
...

的输出javap有点奇怪,我更感兴趣的是获得“类似 Java”的输出。也许一个代表类型签名的字符串是一个更好的类型,可以很容易地生成这个字符串。

另一个例子:

package abc
object O {
  def x(i: Int)(j: Int) = i+j
}

// type of x should be displayed something like
"int abc.O$.x(int, int)"

是否已经支持这样的东西,如果没有,如何为任何类型构建这样的输出?

4

1 回答 1

0

类型已经是完整的类型签名,但它们不包括完整的路径。为此,您必须前往符号并获取其所有者,或类似的东西。

关于新反思的每一个问题都在这样做,所以如果你能更具体一点,那会有所帮助。

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[abc.O.type].member(newTermName("x")).typeSignatureIn(typeOf[abc.O.type])
res0: reflect.runtime.universe.Type = (i: scala.Int)(j: scala.Int)scala.Int
于 2012-07-26T02:30:29.993 回答