Рассмотрите следующий код:
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).
Что предложенный путь состоит в том, чтобы сделать это?
Похоже, что невозможно сделать то, что я хочу, не попробовав все возможные типы вручную 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]]
.
.
.
Что ж, будем надеяться, что в будущем появится язык, на котором что-то подобное работает ...
Как уже упоминалось, методы отражения возвращают Object
, поэтому вам нужно выполнить приведение. Возможно, вам будет лучше использовать метод, который компилятор Scala создает для доступа к полю, вместо того, чтобы изменять видимость частного поля. (Я даже не уверен, что личное поле имени гарантированно будет таким же, как у методов доступа.)
val foo = new Foo
val method = foo.getClass.getDeclaredMethod("name")
val value = method.get(foo).asInstanceOf[String]
getDeclaredField
- это метод java.lang.Class
.
Вы должны изменить foo.getDeclaredField ("name")
на foo.getClass.getDeclaredField ("name")
(или classOf [Foo] .getDeclaredField ( "name")
), чтобы получить поле.
Вы можете получить тип с помощью метода getType
в классе Поле
, но это вам не поможет, потому что он возвращает Class [_]
. Учитывая, что вы знаете, что тип является String, вы всегда можете привести значение, возвращаемое с помощью field.get (foo) .asInstanceOf [String]
AFAIK, отражение всегда работает с Object, и вы должны сами приводить результаты.