我知道,Python和Ruby有該片段if __name__ == '__main__':
和if __FILE__ == $0
,這將只運行如果腳本是直接打開運行。
這似乎是,我沒有在Java中看到一個非常有用的功能(我校的「官方」的編程語言)。在Java中是否有與此等價的東西?如果沒有,是否有任何方法來實現它?
我知道,Python和Ruby有該片段if __name__ == '__main__':
和if __FILE__ == $0
,這將只運行如果腳本是直接打開運行。
這似乎是,我沒有在Java中看到一個非常有用的功能(我校的「官方」的編程語言)。在Java中是否有與此等價的東西?如果沒有,是否有任何方法來實現它?
Java有public static void main(String[] args)
方法。當一個類被作爲運行在命令行主類,這是調用,一般只在這種情況下調用(你可以直接調用它,但它通常沒有意義)。所以,在java中,標準是在這個方法中放置「主要調用」邏輯。
獲取堆棧跟蹤,並看看第一種方法:
Throwable t = new Throwable();
StackTraceElement[] elems = t.getStackTrace();
... elems[elems.length-1] should contain a main method ... check if it is yours :) ...
換句話說,只要在你正在處理的任何文件中向類中添加一個名爲'main'的靜態方法。 – cam 2011-04-17 22:23:28
但是,只有當您不啓動任何單獨的線程時纔有效。 – 2011-04-17 23:11:59
要添加到jthalborn's answer:
真正的問題是不是?「我怎麼做到這一點在Java中」它是「爲什麼Ruby和Python需要這樣一個kludge?」
答案是,當文件加載時(無論是作爲庫還是作爲主程序),Ruby和Python都希望從頭到尾執行一個文件,因此您需要黑客說「不要運行這個部分如果我被稱爲圖書館「。 Java沒有從開始到結束運行文件或類的期望。它具有在其中包含的代碼,當該類別被用作主程序特定類一個main()
。因此,Java不需要這種破解。 (C和C++在這方面與Java相似,但在程序中只能有一個main()
函數,因此您需要求助於使用預處理器來決定編譯哪一個函數,或者您需要將不同的main()
函數在不同的文件中,並且只能編譯你需要的文件。)
我不想爲「kludge」/「hack」評論降低評分,但這是錯誤的。這是一個設計決策,有效地「執行」一個包含圖書館的內容會給你帶來有趣的可能性(你知道模塊初始化的確切順序/時刻)。人們也可以稱Java的模型爲黑客,因爲編譯期間必須使用可用的API。不同的方法!= kludge。 – viraptor 2011-05-31 12:27:52
的'main'功能沒有被包括類作爲您的項目庫中調用僅。如果你想爲圖書館運行'main',你就不得不明確地調用它。 – 2011-04-17 22:35:54