2011-11-10 15 views
0

私は、カスタムクラスを参照する属性の種類を取得しようとしている、私はちょうどそれがObject型の私のコードScalaの反射フィールドクラス

だと取得:

class Edge[N <% Node](var from : N, var to : N) { 

    def toXml(c: Class): xml.Elem = { 
    <edge>{ 
     for(field: Field <- classOf[this.type].getDeclaredFields) 
     yield <field name={field.name} tpe={field.tpe.toString()}>{ this.getClass().getMethods.find(_.getName() == field.name).get.invoke(this) }</field> 
    }</edge> 
    } 

が問題ここでは、私はJavaのフィールドとスカラのフィールドを切り替える必要があります:明らかにスカラのthis.getClassのようなものはありません?だから私はクラスを取得するためにJavaを通過する必要がありますか? しかし、これは型としてのオブジェクトの結果にしか見えません。

答えて

1

編集:改訂された質問は次のとおりです。scala.reflect.Fieldまたはjava.lang.reflect.Fieldを使用する必要がありますか?

回答:二つの理由のために必ず[*]をjava.lang.reflect.Fieldを使用し、一般的なJavaリフレクションで:xxx.getClass(によって返されるものである

  1. )getDeclaredFields()
  2. 次のコメントはscala.reflect.Field

の定義の隣にあります。

/** This type is required by the compiler and <b>should not be used in client code</b>. */ 
case class Field(override val fullname: String, tpe: Type) extends GlobalSymbol(fullname) 

[*]少なくとも今のところ。すぐにスカラに反映されています。

- オリジナルの答え:

あなたにもクラスコードを掲載場合には役立つだろうが、フィールドがObjectとして宣言されているようです。 getTypeは、フィールドの宣言クラスを返します。 Field#getType()から

このFieldオブジェクトによって表されるフィールド の宣言タイプを識別するClassオブジェクトを返します。

class Foo { 
    var bar: String = "string" 
    var bar2: java.lang.Object = "string" 
} 

for (field <- new Foo().getClass.getDeclaredFields()) { 
    println("field=" + field.getName() + " " + field.getType.toString()) 
} 

は、インスタンスのタイプをしたい場合は、あなたが通常の方法でインスタンス上.getClass()を行う必要があります

field=bar class java.lang.String 
field=bar2 class java.lang.Object 

を与えます。

+0

私は質問に多くのコードと説明を追加しました。 – user485659