ошибка отражения scala java

#java #scala #reflection

#java #scala #отражение

Вопрос:

Я пытаюсь использовать scala.reflect для получения атрибутов класса и записи их в XML. Однако я получаю странную ошибку

  def toXml(): xml.Elem = {
<node>{
  for(field: scala.reflect.Field <- getClass().getDeclaredFields()) {
    val tmpString = "<"   field.name   ">"   this.getClass().getMethods.find(_.getName == field.name).get.invoke(this)   "</"   field.name   ">"
    print(tmpString)
  }
 }</node>
}
  

Ошибка:

 error: type mismatch;
found   : scala.reflect.Field => Unit
required: java.lang.reflect.Field => ?
for(field: scala.reflect.Field <- getClass().getDeclaredFields()) {
  

Поэтому, даже если я явно использую scala.reflect.Поле, оно по-прежнему рассматривается как java.lang.reflect.Поле?

Ответ №1:

getClass().getDeclaredFields() возвращает java.lang.reflect.Field объекты. Если вы не найдете способ преобразования между этими двумя классами, вы не сможете объявить их как scala.reflect.Field и ожидать, что они будут работать.

РЕДАКТИРОВАТЬ: исправление для вашего кода:

 for(field: java.lang.reflect.Field <- getClass().getDeclaredFields()) {
  

Комментарии:

1. есть ли какой-либо способ получить список полей класса в scala?

2. @пользователь485659, посмотри правку. Имейте в виду, что во многих случаях вам даже не нужно объявлять тип, поскольку он будет выведен.

3. Спасибо, однако сейчас я сталкиваюсь с другой проблемой, я пытаюсь получить тип атрибута, который ссылается на пользовательский класс, я просто получаю, что он имеет тип Object My code: <edge>{ for(field: java.lang.reflect. Поле <- getClass().getDeclaredFields()) выдает <имя поля={field.getName()} tpe={field.GetType().toString()}>{ this.getClass().GetMethods.find(_.getName == field.getName()).get.invoke(this) }</field> }</edge>