没有typeOf的scala反射

zla*_*aja 1 reflection scala

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

我添加了例子.

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>
Run Code Online (Sandbox Code Playgroud)

这就是我获得领域的方式

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

然后我从现场得到了setter

field.asMethod.setter
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我怎么称呼应用setter.我也不是害羞我是否以正确的方式得到了自己的身份.

zla*_*aja 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)
Run Code Online (Sandbox Code Playgroud)