2017-04-04 30 views
0

是否可以使用反射從Java引用Scala對象類?反映來自Java的Scala對象

爲了說明我的意思,這是這樣做的(假設MyClass的是Scala的對象)的Scala代碼:

val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader) 
    val module = runtimeMirror.staticModule("MyClass") 
    val obj = runtimeMirror.reflectModule(module) 
    val realObject: MyInterface = obj.instance.asInstanceOf[MyInterface] 

在Java中,我成功地加載的類,但我似乎無法到能夠獲得對象的實際引用;因爲它沒有公共構造函數,所以在類上調用newInstance()顯然失敗。

我已經成功通過反射得到它的構造和將其設定爲接近要解決它,但是這似乎是一個黑客對我..有一個BKM做這樣的事情?

+0

大量的反射代碼這是否...'setAcessible(真)'是。那種你已經在使用*反射*,這已經是一個黑客 – Eugene

+0

Scala的對象編譯爲2'.class'文件,一個只包含靜態轉發到實現(單身),稱爲'$ MODULE'等一個,內帶有'$'的類。看到這個答案http://stackoverflow.com/a/12785219/4496364。我想你想要'MODULE $'實例... –

+0

@Eugene然而,'setAccessible'的這種特殊用法會給出錯誤的結果。 –

回答

0

從INSAN-E提MODULE $奏效了註釋。

下面的代碼現在可以按預期(從外部jar文件加載類):

String className = "MyClass"; 
File f = new File("C:\\TEMP\\source.jar"); 
URLClassLoader urlCl = new URLClassLoader(new URL[]{f.toURI().toURL()}, getClass().getClassLoader()); 
Class c = urlCl.loadClass(className); 
Field module = c.getField("MODULE$"); 
if (module.get(this) instanceof MyInterface) 
{ 
    MyInterface obj = (MyInterface) module.get(this); 
}