класс поля отражения scala - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь получить тип атрибута, который ссылается на пользовательский класс, я просто получаю, что он имеет тип 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 и полем scala: по-видимому, в scala нет такого понятия, как this.getClass? Так что мне нужно пройти через Java, чтобы получить класс? Однако это, кажется, приводит только к объектам как типам?

1 Ответ

1 голос
/ 10 ноября 2011

РЕДАКТИРОВАТЬ: пересмотренный вопрос: следует использовать 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)

[*] По крайней мере, на данный момент. скоро прибудет отражение в Скале.

- Оригинальный ответ:

Было бы полезно, если бы вы также опубликовали код класса, но кажется, что поле объявлено как Object. getType возвращает класс объявления поля.

С Поле # getType () :

Возвращает объект 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())
}

дает

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

Если вы хотите указать тип экземпляра, то вам нужно выполнить .getClass () для экземпляра обычным способом.

...