斯卡拉反射场类

时间:2011-11-10 00:11:47

标签: scala reflection field

我试图获取引用自定义类的属性类型,我只是得到它的类型为Object

我的代码:

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 Field和scala字段之间切换:显然scala中没有this.getClass这样的东西?所以我需要通过Java来获得课程? 然而,这似乎只导致对象作为类型?

1 个答案:

答案 0 :(得分:1)

编辑:修改后的问题是:是否应该使用scala.reflect.Field或java.lang.reflect.Field?

答案:始终[*]使用java.lang.reflect.Field,一般来说java反射有两个原因:

  1. 这是xxx.getClass()返回的内容.getDeclaredFields()
  2. 以下评论位于scala.reflect.Field
  3. 的定义旁边

    /** 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()

      

    返回一个Class对象,该对象标识字段的声明类型   由此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()。