2014-09-17 9 views
7

में बाइट [] के लिए डेटा प्रकार रेंडरर्स सूची का उपयोग कैसे करें, इसलिए मेरे पास इन सभी बाइट [] हैं, और उनका एन्कोडिंग वर्तमान में डिबगिंग के आधार पर कई अलग-अलग प्रारूपों में से एक हो सकता है। मैं बाइट सरणी के अनुमानों की एक सूची को टॉस करने में सक्षम होना चाहता हूं। मैं इंटेलिजे के डेटा टाइप रेंडरर्स व्यू का उपयोग कर रहा हूं, बाइट [] टाइप करने के लिए रेंडरर को लागू कर रहा हूं, और मैं मुख्य रूप से अभिव्यक्ति बॉक्स की सूची से चिंतित हूं।इंटेलिजे

तो मैंने देखा है कि आप new String(this) अभिव्यक्ति के साथ नोड कैसे प्रस्तुत कर सकते हैं, हालांकि यह नीचे अभिव्यक्ति दृश्य की सूची में काम नहीं करता है। आखिरकार मैं new String(this, "UTF16") (या हेक्स या बेस 64 या डब्ल्यू/ई में रूपांतरण करता हूं) जैसे अभिव्यक्ति करना चाहता हूं लेकिन this अभिव्यक्ति सूची बॉक्स में बाइट [] नहीं दिखता है - वास्तव में, जब मैं (byte[])this जैसे टाइपकास्ट को आजमाने की कोशिश करता हूं परिणाम Inconvertible types; cannot cast '_Dummy_.__Array__≤T≥' to 'byte[]' (java.lang.Byte [] के लिए समान व्यवहार कहते हैं)। यह वास्तव में अजीब व्यवहार है, कि एक स्थान पर यह एक बाइट [] है और दूसरे में यह कुछ अपारदर्शी आंतरिक प्रकार है।

काम केवल फ़ील्ड को प्रदर्शित करने में क्या काम करता है - यानी this.length जैसी अभिव्यक्ति अपेक्षित कार्य करती है। साथ ही, this जैसी अभिव्यक्ति बस नोड को फिर से प्रस्तुत करती है, इसका दावा है कि इसका प्रकार बाइट [] है और इसकी ऑब्जेक्ट आईडी मूल की आईडी के समान है।

+0

यह लगभग की तरह आइडिया ऑटो बॉक्स में टाइप कोशिश कर रहा है और विफल हो रहा है लगता है। क्या आप सवाल में जोड़ सकते हैं कि क्या होता है यदि आप java.lang.Byte [] में प्राइमेटिव मैन्युअल रूप से मुक्केबाजी करने का प्रयास करते हैं और अभिव्यक्ति का फिर से मूल्यांकन करते हैं? –

+0

कुछ विवरण जोड़ा गया। किसी भी java.lang प्रकार के लिए _Dummy _.__ Array__ से कोई रूपांतरण नहीं है जिसे मैं जानता हूं :-)। – Kenny

उत्तर

0

मैंने similar question here का उत्तर दिया। _Dummy_.__Array__<T> से byte[] पर जाने में असमर्थ होने के बारे में संदेश एक इंटेलिजे त्रुटि की तरह लगता है जहां यह कॉल स्टैक में कक्षा का नाम निर्धारित नहीं कर सकता है। शायद byte[] के अन्य "रूपों" के लिए डीटीआर जोड़ना मदद करेगा। मैंने नीचे तीन डीटीआर के उदाहरण शामिल किए हैं - byte[], Byte[] और ArrayList

परीक्षण और सहायक विधि (ग्रूवी में लिखा है, तो यकीन है कि यह अपने classpath पर है बनाने या शुद्ध जावा में पुनर्लेखन):

@Test 
void testShouldHandleDTR() { 
    // Arrange 
    byte[] primitiveArray = "90abcdef".bytes 
    Byte[] objectArray = "90abcdef".bytes 
    List<Byte> objectList = "90abcdef".bytes 

    final String EXPECTED_STRING = Hex.encodeHexString(primitiveArray) 
    logger.info("Expected hex string: ${EXPECTED_STRING}") 

    // Fully qualified for DTR dialog 
    String primitiveDTR = "org.bouncycastle.util.encoders.Hex.toHexString(this);" 
    String objectArrayDTR = "org.example.ThisTest.encodeObjectArrayToHex(this);" 
    String objectListDTR = "org.example.ThisTest.encodeObjectArrayToHex(this.toArray());" 

    def types = [primitiveArray, objectArray, objectList] 
    def expressions = [(primitiveArray.class.name): primitiveDTR, 
         (objectArray.class.name): objectArrayDTR, 
         (objectList.class.name): objectListDTR] 

    // Act 
    types.each { it -> 
     logger.info("Contents: ${it}") 
     logger.info("Type: ${it.class.name}") 

     String result = Eval.x(it, expressions[it.class.name].replaceAll(/this/, "x")) 
     logger.info("Result: ${result}") 

     // Assert 
     assert result == EXPECTED_STRING 
    } 
} 

public static String encodeObjectArrayToHex(Object[] objectArray) { 
    byte[] primitiveArray = objectArray.collect { it as byte } 
    Hex.encodeHexString(primitiveArray) 
} 

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

Successful test execution

DTR for ArrayList in action