我有一個特點,命名Init
:如果我知道一個對象的類名,如何獲取它並調用它的方法?
package test
trait Init {
def init(): Any
}
有一些類和對象,擴展了這一特點:
package test
object Config extends Init {
def init() = { loadFromFile(...) }
}
class InitDb extends Init {
def init() = { initdb() }
}
當應用程序已經開始,我會找到它擴展的所有類和對象Init
,並調用它們的init
方法。
package test
object App {
def main(args: Array[String]) {
val classNames: List[String] = findAllNamesOfSubclassOf[Init]
println(classNames) // -> List(test.Config$, test.InitDb)
classNames foreach { name =>
Class.forName(name).newInstance().asInstanceOf[Init].init() // ***
}
}
}
請注意, 「*」 行。對於test.InitDb
,這沒關係。但是對於test.Config$
,當newInstance()
,它拋出一個異常說我們不能訪問它的私有方法。
我的問題是,如何獲得該對象,並運行其init
方法?
謝謝。我試圖將一些啓動代碼放入webapp的某些對象中,但是當jetty啓動時,我發現它們沒有被執行,因爲沒有其他類需要它們。但是我需要在碼頭啓動時執行它們,而不管其他類是否可以訪問它們。如何做?我的解決方案是讓他們擴展'Init',並找到並調用它們作爲我的例子。你能給我更多的建議嗎? – Freewind 2011-03-07 12:48:25
將所有代碼放在專用啓動servlet中,或者使用您的Web框架提供的任何等效機制。如果這些單身人士沒有在其他地方實際使用過,那麼你真的想問你爲什麼要首先定義他們...... – 2011-03-07 12:58:39
謝謝。我現在使用'ServletContextListener'來執行此操作 – Freewind 2011-03-07 13:19:07