【问题标题】:scala reflection without typeOf没有typeOf的scala反射
【发布时间】:2013-05-28 11:58:06
【问题描述】:

在我不使用 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 的应用。我也不确定我是否以正确的方式获得了身份。

【问题讨论】:

  • 只是为了理解你:你有一个带有 setter 方法的类。您不知道类名,但可以在 XML 文件 (?) 中找到该类名。你想获取类并调用 setter-method?
  • 您是否正在寻找该类的现有实例?因为您提到的是“二传手”。还是我们在这里谈论构造函数? :)
  • 我已编辑问题。是的,我想创建该类的对象并填充它。是的,还有 setter(scala setter) 和构造函数。你关于构造函数的问题给了我一个想法,也许可以尝试从实例而不是类中获取字段。
  • 是的,如果我先创建实例然后反映它,我可以让事情正常进行。

标签: scala reflection


【解决方案1】:

最后我想通了,我必须创建 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多