2011-04-05 12 views
23

मुझे लगभग निश्चित है कि यह असंभव है, लेकिन यह एक कोशिश के लायक है।JVM को समाप्त करने से System.exit() को कॉल को कैसे रोकें?

मैं एक निश्चित उपकरण के लिए कमांड लाइन इंटरफ़ेस लिख रहा हूं। मैं एक जावा एप्लिकेशन के बारे में बात कर रहा हूं जो एक और जावा एप्लिकेशन का आह्वान करता है। उपकरण निष्पादन के बाद System.exit पर कॉल करता है, जो बदले में अपने स्वयं के निष्पादन वातावरण को समाप्त करता है। मुझे वह नहीं चाहिए।

क्या System.exit कॉल को अनदेखा करने का कोई तरीका है?

+3

[जावा: संभावित उपकरण का परीक्षण कैसे करें: System.exit()?] (Http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call -System-निकास)। भले ही उस प्रश्न का शीर्षक भ्रामक हो सकता है, यह वही प्रश्न है: System.exiting से बाहरी कोड को रोकें। –

उत्तर

14

हां, सुरक्षा प्रबंधक का उपयोग करना संभव है। (सही नहीं हो सकता है) के बाद का प्रयास करें:

myMethod() { 
    //Before running the external Command 
    MySecurityManager secManager = new MySecurityManager(); 
    System.setSecurityManager(secManager); 

    try { 
     invokeExternal(); 
    } 
    catch (SecurityException e) { 
     //Do something if the external code used System.exit() 
    } 
} 
+3

मैं अन्य विशेषाधिकार प्राप्त संचालन से संबंधित सुरक्षा अपवादों से बचने के लिए सुरक्षा प्रबंधक की 'चेकप्रमिशन' विधि को ओवरराइड करने का भी सुझाव देता हूं। –

+0

@ थेमेगा मैंने आपके कोड का उपयोग किया, लेकिन अब मुझे –

+0

@EmmanuelBourg पढ़ने के लिए प्रत्येक फ़ाइल के लिए एक्सेस अस्वीकार कर दिया गया है, मैंने जवाब में कोड का उपयोग किया था, लेकिन अब मुझे प्रत्येक फ़ाइल के लिए "एक्सेस अस्वीकृत" त्रुटि मिलती है जिसे मैं पढ़ना चाहता हूं –

2

System.exit() को अनदेखा करने के लिए SecurityManager सेट करें, जब तक कि यह आपके कोड से न आए।

2

आप अपने आवेदन को दो भागों में तोड़ सकते हैं। उपकरण द्वारा पहला शुरू किया जाता है। फिर आप एक नई प्रक्रिया के रूप में अपने आवेदन का दूसरा भाग लॉन्च करते हैं। फिर होस्ट एप्लिकेशन आपके पहले भाग को मारता है, लेकिन दूसरा भाग अभी भी चल रहा है।

इस प्रकार आपके ऐप का पहला भाग केवल दूसरे भाग के लिए स्टार्टअप है जो आपके असली एप्लिकेशन को बदले में बदलता है।

1

this (@Vonc answer) करने के बारे में आप का उपयोग करना चाहिए सुरक्षा प्रबंधक:

संशोधित करने का प्रयास

class MySecurityManager extends SecurityManager { 
    @Override public void checkExit(int status) { 
    throw new SecurityException(); 
    } 
} 

अपनी कक्षा में निम्नलिखित कॉल का उपयोग के साथ चलाने के लिए टेस्टकेस एक सुरक्षा प्रबंधक है जो सिस्टम.एक्सिट को कॉल करने से रोकता है, फिर सुरक्षा अपवाद को पकड़ें।

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