2013-05-28 70 views
1

如何在不使用universe.typeOf [T]獲取成員的情況下通過scala反射api調用setter方法,而是從xml文件中讀取類名。scala reflection without typeOf

我加了個例子。

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方法的適用,如果有可能的。另外我不舒服我是否以正確的方式獲得身份證。

+2

只是想了解您:您有一個帶setter方法的類。類名不爲人知,但在XML文件(?)中找到。你想獲得課程並調用setter方法? –

+2

你在找那個類的一個實例嗎?因爲你提到了一個「二傳手」。或者我們在這裏談論一個構造函數? :) – fresskoma

+0

我編輯過的問題。是的,我想創建該類的對象並填充它。是的,和setter(scala setter)和構造函數。你關於構造函數的問題給了我想法,也許嘗試從實例而不是從類中獲取字段。 – zlaja

回答

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)