5

私は、特性の詳細な分析を達成するために、リフレクションで遊んでいます。私が取得したいものの1つは、メンバーフィールドに設定された初期値です。たとえば、トレイトでは:

trait A {
  val x: Int = 3
  val y: String = "y"
}

3と「y」を知っているといいでしょう。APIでこのタスクに関連するものは何も見つかりませんでした。また、次の出力(scalac -Xprintによって生成された)が原因です。

abstract trait A extends Object {
  <accessor> def com$hablapps$A$_setter_$x_=(x$1: Int): Unit;
  <accessor> def com$hablapps$A$_setter_$y_=(x$1: String): Unit;
  <stable> <accessor> def x(): Int;
  <stable> <accessor> def y(): String
};
abstract trait A$class extends  {
  def /*A$class*/$init$($this: com.hablapps.A): Unit = {
    $this.com$hablapps$A$_setter_$x_=(3);
    $this.com$hablapps$A$_setter_$y_=("y");
    ()
  }
}

それらは$init$メソッドの本体に保持されているため、アクセスするのは非常に困難になると思います。これらの値を反映して取得する(簡単な)方法はありますか?

4

3 に答える 3

1

ここまで内省できるとは思えません。それは型に関する情報ではなく、コードです。特性のツリーがあれば、それを見つけることができますが、そうでなければ、私はそれを疑っています.

ただし、クラス ファイル パーサーを使用して、これをさらに調査することができます。これらは、読み取り可能なクラスの定数として表示されると思います。それらを変数に関連付けることができるかどうかはわかりませんが...

クラスファイルのパーサーについてはあまり詳しくありませんが、「asm」というツールがそれを行っていると思います。

于 2012-07-19T16:01:39.440 に答える