#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>