2011-11-10 58 views
0

我試圖得到一個指向自定義類屬性的類型,我只是得到它的類型對象階反射場類

我的代碼:

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字段和scala字段之間切換:顯然在scala中沒有this.getClass這樣的東西?所以我需要通過Java來獲得課程? 但是,這似乎只會導致對象作爲類型?

回答

1

編輯:修改後的問題是:應該使用scala.reflect.Field還是java.lang.reflect.Field?

答:任何時候[*]使用java.lang.reflect.Field中,和一般的Java反射的原因有兩個:

  1. 這就是由xxx.getClass()返回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) 

[*]至少現在。思考即將到來。

- 原來的答覆:

這將有助於如果您發佈的類代碼爲好,但它似乎字段聲明爲對象。 getType返回該字段的聲明類。

Field#getType()

返回標識了此Field對象表示的字段 聲明類型一類對象。

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()) 
} 

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

如果您希望實例的類型,那麼你將不得不在實例上做.getClass()以正常方式。

+0

我已經添加了更多的代碼和更多解釋的問題。 – user485659