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 に答える