Как получить доступ к значению поля через отражение (Scala 2.8)

Рассмотрите следующий код:

class Foo(var name: String = "bar")

Теперь я пытаюсь получить значение и корректный тип его через отражение:

val foo = new Foo
val field = foo.getClass.getDeclaredField("name")
field.setAccessible(true)
//This is where it doesn't work
val value = field.get(????)

Я попробовал вещи как field.get (нечто), но это просто возвращает java.lang. Объект, но никакая Строка. В основном мне нужен корректный тип, потому что я хочу вызвать метод на него (например, toCharArray).

Что предложенный путь состоит в том, чтобы сделать это?

12
задан soc 17 April 2010 в 14:02
поделиться

4 ответа

Похоже, что невозможно сделать то, что я хочу, не попробовав все возможные типы вручную e. грамм.

o match {
    case I  if o.isInstanceOf[Int] => val i = I.asInstanceOf[Int] 
    case F  if o.isInstanceOf[Float] => val f = I.asInstanceOf[Float] 
    case S  if o.isInstanceOf[String] => val s = I.asInstanceOf[String] 
    case OF if o.getGenericType.toString == "scala.Option<java.lang.Float>" => val of = OF.asInstanceOf[Option[Float]]
    .
    .
    .

Что ж, будем надеяться, что в будущем появится язык, на котором что-то подобное работает ...

-1
ответ дан 26 October 2019 в 14:54
поделиться

Как уже упоминалось, методы отражения возвращают Object , поэтому вам нужно выполнить приведение. Возможно, вам будет лучше использовать метод, который компилятор Scala создает для доступа к полю, вместо того, чтобы изменять видимость частного поля. (Я даже не уверен, что личное поле имени гарантированно будет таким же, как у методов доступа.)

val foo = new Foo
val method = foo.getClass.getDeclaredMethod("name")
val value = method.get(foo).asInstanceOf[String]
6
ответ дан 2 December 2019 в 22:04
поделиться

getDeclaredField - это метод java.lang.Class .

Вы должны изменить foo.getDeclaredField ("name") на foo.getClass.getDeclaredField ("name") (или classOf [Foo] .getDeclaredField ( "name") ), чтобы получить поле.

Вы можете получить тип с помощью метода getType в классе Поле , но это вам не поможет, потому что он возвращает Class [_] . Учитывая, что вы знаете, что тип является String, вы всегда можете привести значение, возвращаемое с помощью field.get (foo) .asInstanceOf [String]

4
ответ дан 2 December 2019 в 22:04
поделиться

AFAIK, отражение всегда работает с Object, и вы должны сами приводить результаты.

1
ответ дан 2 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: