2011-12-27 105 views
1
Class<?> clazz = loadClass("Test"); 
Method printSomething = clazz.getDeclaredMethod("printSomething"); 
printSomething.invoke(clazz); 

我想弄清楚如何在Scala中做到這一點。我猜想我錯過了斯卡拉處理反射的方式。scala中的反射。調用方法?

val clazz = loadClass("Test") 
val printSomething = clazz.getDeclaredMethod("printSomething") 

printSomething.invoke(clazz) 

我的主要問題:是對Any對象相同的Java Class<?>

+0

您的代碼不夠完整,無法告訴這裏有什麼 - 例如,「渲染」來自哪裏。 – 2011-12-27 21:09:20

+3

你發佈的Scala代碼有什麼問題,如果有的話? – 2011-12-27 22:00:59

+0

固定代碼。那麼我或多或少地問什麼Class 轉移到斯卡拉?謝謝。 – 2011-12-28 03:53:15

回答

4

Any與Java中的Class<?>不一樣。

Any類型是Java的Object的擴展的替代方案:與Java的Object不同,它是從字面上理解Scala中的所有東西的超類型,包括基元。

Class[_](簡稱Class[Any])與Java的Class<?>類型相同,即它是Java的Class<?>在Scala中呈現的方式。 Scala中類型爲Class的實例與Java中的實例類似,它提供的基本反射功能超過了作爲其通用參數提供的類型。即Class[Something]的實例提供了標準的Java反射API,其類別爲Something。您可以像在Java中一樣使用它。要獲得該實例,請調用標準方法classOf[Something]instanceOfSomething.getClass

主要針對類型擦除問題的解決方案的擴展反射功能隨Scala 2.10一起推出,它是您可以隨時下載的非常穩定的快照版本。該擴展API通過對象scala.reflect.runtime.Mirror提供。互聯網上沒有太多的文檔,但是你可以在StackOverflow上找到一些體面的信息。