我發現以下問題: $0 (Program Name) in Java? Discover main class? 但接受的答案在這種情況下失敗:
public class Derived extends Base { }
class Base {
public static void main(String[] args){
System.out.println(getTheClassName());
}
static String getTheClassName(){
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
StackTraceElement main = stack[stack.length - 1];
return main.getClassName();
}
}
當調用:
java Derived
輸出不幸Base
不Derived
預期。
是否有可能獲得real的主名? (順便說一句,jps
工具正確檢測主類,但要獲得正確的名稱,我需要知道當前VM的ID,這也是一個問題)
此致敬意。
編輯:準確地說:我需要知道作爲傳遞給JVM的命令行參數傳遞的類的名稱是什麼。 jps
工具以我想要的方式進行,但由於其他問題(如未知的VMid),我無法使用此工具。
EDIT2:全球答覆托爾比約恩的回答:
爲了您的工作方式,你需要有一個非靜態方法來代替。讓它 非靜態,有一個main()的派生做一個新的衍生()。getTheClassName()
我想知道我能得到的名稱無須在派生類主要方法。
解決方案:我將提供兩種(Thorbjørn's和erickson's)初始化類的機制;-)所有的答案都非常有幫助。我接受Thorbjørn的回答,因爲他早於erickson發佈了他的答案。謝謝。
我知道你已經發布的解決方法,但我想知道,如果不在'Derived'類中實現'main'方法,我可以得到名稱。 – 2010-08-24 20:30:57
據我所知,這在純Java中是不可能的。不過,您可以通過JMX或JVM特定的方法向HotSpot詢問此問題,但這可能是供應商特定的解決方案。你爲什麼需要這個? – 2010-08-24 20:34:05
我需要這樣的某種應用程序框架:我將提供主要方法的實現;框架的用戶只能從'Base'類派生,並且能夠使用我的* boostted *'main'運行他/她的類。 – 2010-08-24 20:42:02