getClass.getFields возвращает поля из библиотеки Scala Reflection вместо полей из пакета - PullRequest
0 голосов
/ 22 января 2020

Я использую библиотеку отражений Scala для доступа и выполнения функции main () банки, которую я прикрепил к своему проекту. Я могу сделать это очень успешно, но теперь я хотел бы использовать Reflection для доступа к указанному полю c в этом фляге и установить его значение во время выполнения.

Однако, когда я запускаю приведенный ниже код, fields.map(f => print(f)) печатает поля библиотеки отражений Scala, а не поля банки. Есть идеи, почему это происходит? Я искал разрешение в течение недели и был бы очень признателен за любую помощь!

Код:

val rm = scala.reflect.runtime.currentMirror

val staticClass = rm.staticModule("com.dummy.package.name")

val im1 = rm.reflectModule(staticClass)

val x = im1.instance

val im = rm.reflect(x)

val fields = staticClass.getClass.getDeclaredFields

fields.map(f => print(f))

Вывод:

publi c final scala .reflect.internal.Symbols $ Symbol scala .reflect.internal.Symbols $ Symbol.scala $ отражает $ внутренний $ Symbols $ Symbol $$ initOwner publi c final scala .reflect.internal.Names $ Name scala .reflect.internal.Symbols $ Symbol.scala $ отражает $ внутренние $ символы $ Symbol $$ initName publi c final scala .reflect. internal.SymbolTable scala .reflect.internal.Symbols $ SymbolContextApiImpl. $ external

1 Ответ

0 голосов
/ 22 января 2020

getClass это обычный метод Object.getClass, который возвращает класс объекта staticClass, а не класс, который он представляет. Если вы более знакомы с Java отражением, эквивалент будет Something.class.getClass().getDeclaredFields() вместо Something.class.getDeclaredFields().

Если com.dummy.package.name на самом деле Scala object, то вы можете сделать

im1.instance.getClass

(instance возвращает зеркальный объект). Если это класс c класса Java (или вы не знаете), я думаю

rm.runtimeClass(im1.companion.asClass)

, но я не уверен и не могу проверить в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...