2008-09-03 15 views
51

क्या जावा में चल रहे प्रोग्राम का नाम ढूंढने का कोई तरीका है? मुख्य विधि का वर्ग पर्याप्त होगा। यदि आप मुख्य थ्रेड से चला रहे हैं

StackTraceElement[] stack = Thread.currentThread().getStackTrace(); 
    StackTraceElement main = stack[stack.length - 1]; 
    String mainClass = main.getClassName(); 
बेशक

, यह केवल काम करता है:

उत्तर

45

इस प्रयास करें। दुर्भाग्य से मुझे नहीं लगता कि एक सिस्टम प्रॉपर्टी है जिसे आप इसे ढूंढने के लिए पूछ सकते हैं।

संपादित करें: @ जॉन Meagher की टिप्पणी है, जो एक बहुत अच्छा विचार है में खींच:

@jodonnell आप भी प्रणाली Thread.getAllStackTraces का उपयोग करने में सभी स्टैक ट्रेस प्राप्त कर सकते हैं पर विस्तार करने के लिए() । से आप "मुख्य" थ्रेड के लिए के लिए सभी वर्ग निशान खोज सकते हैं यह निर्धारित करने के लिए कि मुख्य वर्ग क्या है। यह काम करेगा, भले ही आपकी कक्षा मुख्य धागे में चल रही न हो।

+0

अच्छा चाल। आम तौर पर, कोई इसे मुख्य() से कॉल करेगा, इसलिए इस बिंदु पर केवल एक धागा है, लेकिन अगर इसे कहीं और कहा जाता है, तो हमारे पास इस धागे की समस्या को बेहतर तरीके से रखना चाहिए ... – PhiLho

+4

कोई गारंटी मुख्य थीम नहीं है जब आप अन्य धागे से ऐप नाम ढूंढने का प्रयास करेंगे तो दौड़ें। मुख्य धागा सामान्य रूप से समाप्त हो सकता है और कुछ अन्य पृष्ठभूमि धागे अभी तक समाप्त नहीं हुए हैं। ऐसा नहीं लगता कि यह मुख्य धागे से दूसरे को इस चाल को करने के लिए वैध है। –

3

कमांड लाइन से भी आप jps उपकरण चला सकते हैं।

jps -l 

आपको जो चाहिए वह मिल जाएगा।

15

@jodonnell पर विस्तार करने के लिए आप Thread.getAllStackTraces() का उपयोग कर सिस्टम में सभी स्टैक निशान भी प्राप्त कर सकते हैं। इससे आप मुख्य श्रेणी क्या है यह निर्धारित करने के लिए main थ्रेड के लिए सभी स्टैक निशान खोज सकते हैं। यह तब भी काम करेगा जब आपकी कक्षा मुख्य धागे में नहीं चल रही है।

+7

मुख्य थ्रेड के लिए चलना बंद करना संभव है लेकिन एप्लिकेशन अभी भी जारी है (अन्य गैर-डिमन थ्रेड)। यह संभवतया कई जीयूआई/स्विंग अनुप्रयोगों में होता है क्योंकि सामान्य आइडिया मुख्य थ्रेड के लिए पहला फ्रेम बनाने के लिए ईडीटी पर आक्रमण करने के लिए होता है और फिर समाप्त होता है। –

-5

या आप getClass() का उपयोग कर सकते हैं। आप कुछ ऐसा कर सकते हैं:

public class Foo 
{ 
    public static final String PROGNAME = new Foo().getClass().getName(); 
} 

और फिर PROGNAME Foo के अंदर कहीं भी उपलब्ध होगा।

String myProgramName = this.getClass().getName(); 
+0

मुझे नहीं लगता कि यह समस्या हल करता है। पोस्टर को पता नहीं है कि किस वर्ग में 'मुख्य' विधि शामिल है जिसे जावा शुरू होने पर लागू किया गया था (शायद यह किसी तृतीय पक्ष लाइब्रेरी का हिस्सा है)। –

+1

यह बिल्कुल समझ में नहीं आता है। यह केवल तभी काम करता है जब मुझे पता था कि 'फू' मुख्य वर्ग था। लेकिन फिर मुझे ऐसा करने की आवश्यकता नहीं होगी। – maaartinus

-3

इस प्रयास करें:: आप एक स्थिर संदर्भ में नहीं हैं, तो यह आप इस इस्तेमाल कर सकते हैं के रूप में आसान हो जाता है

जावा वर्गों अपने ही वर्ग (java.lang.Class प्रकार) के स्थिर उदाहरण है ।

इसका मतलब है कि अगर हमारे पास मुख्य नाम वाला वर्ग है। फिर हम Main.class

आप नाम में रुचि रखते हैं उसके बाद ही हैं,

स्ट्रिंग className = Main.class द्वारा अपने वर्ग उदाहरण मिल सकती है।getName();

+0

लेकिन इस मामले में आप नहीं जानते कि कौन सी कक्षा "मुख्य" वर्ग है। – ryantm

2

वर्ग ऑब्जेक्ट के लिए उपयोग के लिए आप एक स्थिर संदर्भ

public final class ClassUtils { 
    public static final Class[] getClassContext() { 
     return new SecurityManager() { 
      protected Class[] getClassContext(){return super.getClassContext();} 
     }.getClassContext(); 
    }; 
    private ClassUtils() {}; 
    public static final Class getMyClass() { return getClassContext()[2];} 
    public static final Class getCallingClass() { return getClassContext()[3];} 
    public static final Class getMainClass() { 
     Class[] c = getClassContext(); 
     return c[c.length-1]; 
    } 
    public static final void main(final String[] arg) { 
     System.out.println(getMyClass()); 
     System.out.println(getCallingClass()); 
     System.out.println(getMainClass()); 
    } 
} 

जाहिर कर रहे हैं जब यहाँ सभी 3 कॉल

class ClassUtils 

वापस आ जाएगी, लेकिन आप चित्र प्राप्त;

classcontext[0] is the securitymanager 
classcontext[1] is the anonymous securitymanager 
classcontext[2] is the class with this funky getclasscontext method 
classcontext[3] is the calling class 
classcontext[last entry] is the root class of this thread. 
8

यह कोड कोड जो मैं जोडननेल और जॉन मेघेर के संयुक्त प्रतिक्रियाओं का उपयोग करते समय आया था। यह एक स्थिर चर में मुख्य वर्ग संग्रहीत करता है बार-बार कॉल की भूमि के ऊपर कम करने के लिए:

private static Class<?> mainClass; 

public static Class<?> getMainClass() { 
    if (mainClass != null) 
    return mainClass; 

    Collection<StackTraceElement[]> stacks = Thread.getAllStackTraces().values(); 
    for (StackTraceElement[] currStack : stacks) { 
    if (currStack.length==0) 
     continue; 
    StackTraceElement lastElem = currStack[currStack.length - 1]; 
    if (lastElem.getMethodName().equals("main")) { 
     try { 
     String mainClassName = lastElem.getClassName(); 
     mainClass = Class.forName(mainClassName); 
     return mainClass; 
     } catch (ClassNotFoundException e) { 
     // bad class name in line containing main?! 
     // shouldn't happen 
     e.printStackTrace(); 
     } 
    } 
    } 
    return null; 
} 
16
System.getProperty("sun.java.command") 
+0

जेडीके पर सत्यापित 1.7.0_07 – sourcedelica

+1

मेरा मानना ​​है कि यह केवल हॉटस्पॉट वीएम पर काम करता है। http://java.dzone.com/articles/programmatically-restart-java देखें – ericsoco

संबंधित मुद्दे