1

在我不使用 Universe.typeOf[T] 获取成员但从 xml 文件中读取类名的情况下,如何通过 scala 反射 api 调用 setter 方法。

我添加了示例。

class Person

class Student(val name: String, val parent: Person){
   var node: String = _
}


<beans>
  <bean id="person" class="com.test.Person"/>

  <bean id="student" class="com.test.Student">
      <constructor signature="this(String,Person)">
        <arg value="Test name"/>
        <arg ref-val="person"/>
      </constructor>

      <property name="note" ref-val="Some note"/>
  </bean>

</beans>

这就是我获取字段的方式

val classMirror =  ru.runtimeMirror(getClass().getClassLoader())
    .classSymbol(Class.forName(className))
classMirror.asType.toType.members.filter {
  item =>       
    !item.isMethod && item.isTerm
}

然后我从外地得到二传手

field.asMethod.setter

如果可能的话,我不知道如何调用 setter 的应用。我也不知道我是否以正确的方式获得了身份证。

4

1 回答 1

5

最后我弄清楚了,我必须创建 person 对象。如果 Person 类具有 String 类型的属性名称,则此代码将起作用:

val rm = ru.runtimeMirror(getClass.getClassLoader)

val classSymbol = rm.classSymbol(Class.forName("com.bsi.workflow.test.Person"))
val classMirror = rm.reflectClass(classSymbol)

val constructorSymbol = classMirror.symbol.toType.members.find {
  item =>
     item.isMethod && item.asMethod.isConstructor
}

val person = classMirror.reflectConstructor(constructorSymbol.get.asMethod)()
val nameSymbol = classMirror.symbol.toType.members.find {
   item => item.name.decoded == "name"
}

val setter = nameSymbol.get.asMethod.setter.asMethod

val cr = rm.reflect(person)

cr.reflectMethod(setter).apply("hi")

println(person.asInstanceOf[Person].name)
于 2013-05-28T23:46:21.677 回答