2014-09-17 3 views
7

Also habe ich alle diese Byte [], und ihre Codierung könnte eines von vielen verschiedenen Formaten sein, abhängig davon, wo ich gerade debuggen. Ich möchte in der Lage sein, eine Liste von Projektionen für das Byte-Array zusammen zu werfen. Ich verwende die IntelliJ-Datentyp-Renderer-Ansicht, wende den Renderer an den Typ byte [] an und befasse mich hauptsächlich mit dem Feld Liste der Ausdrücke.So verwenden Sie die Datentyp-Renderer-Liste für Byte [] in IntelliJ

Also ich habe gesehen, wie Sie den Knoten mit dem Ausdruck new String(this) rendern können, aber das funktioniert nicht in der Liste der Ausdrücke Ansicht unten. Schließlich möchte ich Ausdrücke wie new String(this, "UTF16") machen (oder Konvertierungen zu hex oder base64 oder w/e machen) aber this scheint nicht ein Byte [] in der Liste der Ausdrücke zu sein - in der Tat, wenn ich versuche, wie (byte[])this tippen Ergebnis sagt Inconvertible types; cannot cast '_Dummy_.__Array__≤T≥' to 'byte[]' (dasselbe Verhalten für java.lang.Byte []). Es ist wirklich merkwürdiges Verhalten, dass es an einem Ort ein Byte [] ist und in einem anderen es ein undurchsichtiger interner Typ ist.

Woran zeigt Arbeit einfach die Felder an - d. H. Ein Ausdruck wie this.length funktioniert wie erwartet. Außerdem gibt ein Ausdruck wie this den Knoten einfach neu und behauptet, dass sein Typ Byte [] ist und seine Objekt-ID ist die gleiche wie die ID des Originals.

+0

Es klingt fast wie Idea den Typ Auto Box versucht und versagt. Können Sie der Frage hinzufügen, was passiert, wenn Sie versuchen, die Grundelemente in java.lang.Byte [] manuell einzubetten und den Ausdruck neu zu bewerten? –

+0

Einige Details hinzugefügt. Es gibt keine Konvertierung von _Dummy _.__ Array__ in irgendeinen java.lang-Typ, den ich kenne :-). – Kenny

Antwort

0

Ich antwortete eine similar question here. Die Meldung, dass _Dummy_.__Array__<T> nicht in byte[] umgewandelt werden kann, klingt wie ein IntelliJ-Fehler, bei dem der Name der Klasse im Aufruf-Stack nicht ermittelt werden kann. Vielleicht hilft das Hinzufügen von DTRs für andere "Formulare" von byte[]. Ich habe Beispiele von drei DTRs unter - byte[], Byte[] und ArrayList aufgenommen.

Der Test und die Hilfsmethode (in Groovy geschrieben, so stellen Sie sicher, dass es auf Ihrem Classpath ist oder in reinem umzuschreiben):

@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) 
} 

Für jedes DTR Sie definieren möchten, kopieren Sie einfach den genauen String definiert oben in die Beim Rendern eines Knotens> Verwenden Sie folgenden Ausdruck Feld. Ich würde empfehlen, die Utility-Methode in eine Quellklasse auf Ihrem Klassenpfad im Gegensatz zu einem Test zu setzen, da Sie die Testklasse im DTR-Dialog erneut importieren müssen, da die target/ gereinigt wird.

Successful test execution

DTR for ArrayList in action