2013-05-09 40 views
0

我有很多這方面的用例,圍繞着現有的Java庫和新的Scala代碼之間的互操作。我選擇的用例是我認爲最簡單的用例。有沒有辦法從Java類創建一個新的Scala對象

使用案例:

我上提供的JUnit運行一段斯卡拉測試(這樣我就可以得到在Eclipse我可愛的紅/綠條)工作 亞軍需要有一個構造函數與Java類作爲參數。因此,在斯卡拉我可以做到以下幾點:

class MyRunner(val clazz: Class[Any]) extends Runner { 
    def getDescription(): Description 
    def run(notifier: RunNotifier) 
} 

當我使用兩種

@RunWith(MyRunner) 
object MyTestObject 

@RunWith(MyRunner) 
class MyTestClass 

然後亞軍確實是正確的初始化,並通過適當的類對象

不幸的是,我現在想要做的是「獲得」MyTestObject對象,或創建一個M yTestClass,它們都是Scala實體。我更喜歡使用Scala Reflection,但我也想使用標準的Junit jar。

我做了什麼

以下Stackover流問題是教育,但不相同的問題。有最近的問題,我能找到

http://docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.html的環境,宇宙和鏡子討論是很好的,和其他階反射的類似文件也有幫助。通過它大部分是關於斯卡拉反射。

我瀏覽了Scaladocs,但是我對Scala反射的瞭解還不夠(讓)讓我得到我想要的東西。

編輯: 如這裏問的是,是由反射創建的類的代碼

@RunWith(classOf[MyRunner]) 
object Hello2 extends App { 

    println("starting") 

    val x= "xxx" 
} 

所以有趣的是,提出如下使用調用的模塊$該字段不打印任何解決方案並且x的值爲空

+0

我發現VAL實例= clazz.getField(「MODULE $」)獲得(空)的作品來獲取。目的。這種推薦方式似乎有點「神奇」? – 2013-05-09 11:03:53

+0

這個問題是非常好的http://stackoverflow.com/questions/11020746/get-companion-object-instance-with-new-scala-reflection-api/11031443#11031443 – 2013-05-09 11:34:34

回答

2

如果您想使用plan舊的java反射,此解決方案工作正常。不知道你是否可以使用Scala的反射給所有你已經是一個Class[_]一起工作:

object ReflectTest { 
    import collection.JavaConversions._ 
    def main(args: Array[String]) {  
    val fooObj = instantiate(MyTestObject.getClass()) 
    println(fooObj.foo) 
    val fooClass = instantiate(classOf[MyTestClass]) 
    println(fooClass.foo) 
    } 

    def instantiate(clazz:Class[_]):Foo = { 
    val rm = ru.runtimeMirror(clazz.getClassLoader()) 
    val declaredFields = clazz.getDeclaredFields().toList 
    val obj = declaredFields.find(field => field.getName() == "MODULE$") match{ 
     case Some(modField) => modField.get(clazz) 
     case None => clazz.newInstance() 
    } 
    obj.asInstanceOf[Foo] 
    } 
} 

trait Foo{ 
    def foo:String 
} 

object MyTestObject extends Foo{ 
    def foo = "bar" 
} 

class MyTestClass extends Foo{ 
    def foo = "baz" 
} 
+0

這很好,謝謝你。現在我有了這個實例,我懷疑我可以使用scala反射而不是類。 – 2013-05-09 12:18:41

+0

不幸的是,雖然這可行,但它不會調用實例化隨播對象中的字段的代碼。例如,如果伴隨對象中有val x = 1,則創建的實例上的java反射將返回null。 – 2013-05-09 12:31:15

+0

您可以提供您在問題中提到的兩個類的結構,以便我可以提供解決方案嗎?這是基於類的示例還是基於對象的示例?只是想看看班級/同伴關係以及你想要發生什麼,所以我可以提供一個答案。 – cmbaxter 2013-05-09 12:35:32

相關問題