如果我不使用universe.typeOf [T]来获取成员,而是从xml文件中读取类名,则如何通过scala reflection 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
}
然后我从字段中获取setter
field.asMethod.setter
如果可能的话,我怎么称呼应用setter。我也不是害羞我是否以正确的方式获得了身份。
答案 0 :(得分:5)
我最后弄明白了,我不得不创造人物对象。如果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)