2011-04-05 25 views
26

कमांड लाइन param "-ea" निर्दिष्ट करने के बजाय, मैं विशेष कक्षाओं के लिए प्रोग्रामेटिक रूप से सक्षम कैसे कर सकता हूं?प्रोग्रामेटिक रूप से जोर कैसे सक्षम करें?

public class TestAssert { 

    private static final int foo[] = new int[]{4,5,67}; 


    public static void main(String []args) { 
     assert foo.length == 10; 
    } 
} 

उत्तर

8

यह @ बाला के अच्छे जवाब पर एक टिप्पणी थी, लेकिन यह बहुत लंबा हो गया।

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

यदि वर्ग लोड होने पर दावा सक्षम नहीं हैं तो उन्हें तत्काल "संकलित आउट" होना चाहिए ताकि आप उन्हें चालू और बंद करने में सक्षम न हों। यदि आप उन्हें टॉगल करना चाहते हैं तो आप बिल्कुल दावा नहीं करना चाहते हैं।

public myAssertNotNull(Object o) { 
    if(checkArguments) 
     if(o == null) 
      throw new IllegalArgumentException("Assertion Failed"); 
} 

लगभग के रूप में तेजी से काम करना चाहिए कथनों के रूप में क्योंकि अगर कोड एक बहुत मार डाला जाता है और checkArguments गलत है और उसके बाद परिवर्तन नहीं करता है पूरे विधि कॉल कर सकते हैं:

क्रम संकलन, कुछ इस तरह के कारण

रनटाइम पर संकलित किया जाना चाहिए जिसका दावा एक ही मूल प्रभाव होगा (यह प्रदर्शन वीएम पर निर्भर करता है)।

13

प्रयास करें

ClassLoader loader = getClass().getClassLoader(); 
setDefaultAssertionStatus(true); 

या

ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true); 

संपादित करें:

टिप्पणी के आधार पर

ClassLoader loader = ClassLoader.getSystemClassLoader(); 
    loader.setDefaultAssertionStatus(true); 
    Class<?> c = loader.loadClass("MyClass"); 
    MyClass myObj = (MyClass) c.newInstance(); 


public class MyClass { 

    private static final int foo[] = new int[]{4,5,67}; 
    MyClass() 
    { 
     assert foo.length == 10; 
    } 
} 
+0

जैसा कि आप "टिप्पणियों के आधार पर" छवि को अप्रचलित चिह्नित करने के बाद काम नहीं कर सकते हैं, इसलिए उचित कारण को दस्तावेज करना बेहतर है। आप प्रतिबिंब के माध्यम से MyClass का एक उदाहरण क्यों बनाते हैं? –

1

आप सक्षम कर सकते हैं/प्रोग्राम के रूप में भी दावे को निष्क्रिय:
http://download.oracle.com/docs/cd/E19683-01/806-7930/assert-5/index.html

+0

जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (// meta.stackoverflow.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। –

2

सरल & सबसे अच्छा तरीका हो सकता है:

public static void assertion(boolean condition,String conditionFailureMessage) 
{ 
    if(!b) 
     throw new AssertionError(conditionFailureMessage); 
} 

-ea वीएम तर्क के रूप में स्थापित करने के लिए कोई ज़रूरत नहीं।

कॉल की तरह समारोह:

assertion(sum>=n,"sum cannot be less than n"); 

दावे विफल रहता है, कोड AssertionError दे देंगे, और कोड को सुरक्षित रूप से चलेंगे।

+0

दावे का मुद्दा यह है कि उन्हें जेआरई में सक्रिय किया जा सकता है या नहीं, ताकि एक कथन 'आरोपी एक्स' का प्रभाव हो या नहीं। यह आपके सुझाव के साथ संभव नहीं है। –

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