2011-02-01 10 views
9

द्वारा बाहर निकलने के निर्देश को पकड़ें मेरी आश्चर्य और डरावनी बात के लिए, मैंने अभी उपयोग की लाइब्रेरी में System.exit(1); लाइन का सामना किया है। मैं लाइब्रेरी के लेखकों से संपर्क करने और क्या पूछता हूं, इस बारे में सोच रहा हूं, लेकिन इस बीच लाइब्रेरी को मेरे कोड को मारने से रोकने का कोई तरीका है (और बदतर, का उपयोग करके कोड का उपयोग कर आवेदन को मारना)?लाइब्रेरी

शायद किसी भी तरह पुस्तकालय को SecurityException फेंकने के लिए मजबूर करता है, जो मुझे लगता है कि exit(int) फेंक सकता है?

उत्तर

13

सिर्फ एक ही रास्ता मैं के बारे में पता नहीं है, और कहा कि एक SecurityManager जो System.exit के उपयोग की अनुमति नहीं देता कोड करने के लिए है।

public class MySecurityMgr extends SecurityManager { 
    ... 

    @Override 
    public void checkExit(int status) { 
      throw new RuntimeException(Integer.toString(status)); 
    } 
} 
4

हाँ, आप एक SecurityManager कि checkExit ओवरराइड करता है स्थापित कर सकते हैं।

मैं यह विशेष रूप से कोड unittesting नकली सफलता का संकेत से पहले परीक्षण पूरा होने से चलाने के लिए एक मौका है 0 के साथ सुनिश्चित करें कि कोड का परीक्षण करता है बाहर निकलने नहीं बनाने के लिए, के लिए उपयोगी पाया है।

यह हालांकि मदद नहीं करेगा अगर SecurityException कुछ सामान्य रूप से लंबे समय तक रहा आवश्यक धागा की हत्या समाप्त होता है।

4

मुझे लगता है कि अपने एकमात्र विकल्प (गीला तौलिये के साथ लेखक whacking जब तक वह लानत बात का पुनर्लेखन की कमी) लाइब्रेरी की बाइट कोड को बदलने के लिए किया जाएगा।

सुंदर दृष्टिकोण लोड समय बुनाई के साथ AspectJ उपयोग करने के लिए जब आप लायब्रेरी लोड है, बदसूरत विकल्प एएसएम जैसे किसी उपकरण का उपयोग करने के लिए या तो हटा सकते हैं या विधि कॉल को बदलने के लिए है।

यहाँ एक AspectJ पहलू यह है कि System.exit() के लिए कॉल विक्षेपित है:

public aspect SystemExitEvader{ 

    pointcut systemExitCall() : call(* java.lang.System.exit(*)); 

    void around() : systemExitCall(){ 
     System.out.println("Call to System.exit() attempted"); 
     // note: there is no call to proceed() 
    } 

} 

ठीक है, मैं SecurityManagers के बारे में अन्य उत्तर देखा है और मैं मानता हूँ कि शायद जाने का रास्ता है, लेकिन मैं छोड़ देंगे एक विकल्प के रूप में मेरा जवाब यहाँ।

3

हाँ सुरक्षा प्रबंधक चाल कर सकते हैं

// install security manager to avoid System.exit() call from lib 
SecurityManager  previousSecurityManager = System.getSecurityManager(); 
final SecurityManager securityManager   = new SecurityManager() { 
    @Override public void checkPermission(final Permission permission) { 
     if (permission.getName() != null && permission.getName().startsWith("exitVM")) { 
     throw new SecurityException(); 
     } 
    } 
    }; 
System.setSecurityManager(securityManager); 

try { 
    // Call here your lib code 
} catch (SecurityException e) { 
    // Say hi to your favorite creator of closed source software that includes System.exit() in his code. 
} finally { 
    System.setSecurityManager(previousSecurityManager); 
} 
संबंधित मुद्दे