没有typeOf的scala反射

时间:2013-05-28 11:58:07

标签: scala reflection

如果我不使用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。我也不是害羞我是否以正确的方式获得了身份。

1 个答案:

答案 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)