2014-09-17 9 views
7

Quindi ho tutti questi byte [] 's, e la loro codifica potrebbe essere uno dei molti formati diversi, a seconda di dove sono attualmente in fase di debug. Mi piacerebbe essere in grado di mettere insieme una lista di proiezioni per l'array di byte. Sto usando la vista Renderizzatori di tipo di dati di IntelliJ, applicando il renderer al tipo byte [], e sono principalmente interessato alla casella Lista di espressioni.Come utilizzare il tipo di dati Elenco Renderer per byte [] in IntelliJ

Quindi ho visto come è possibile eseguire il rendering del nodo con l'espressione new String(this), tuttavia ciò non funziona nell'elenco delle espressioni visualizzato di seguito. Alla fine voglio fare espressioni come new String(this, "UTF16") (o effettuare conversioni in hex o base64 o w/e) ma this non sembra essere un byte [] nella casella di elenco delle espressioni - infatti, quando provo a typecast come (byte[])this il risultato dice Inconvertible types; cannot cast '_Dummy_.__Array__≤T≥' to 'byte[]' (stesso comportamento per java.lang.Byte []). È un comportamento davvero strano, che in un punto è un byte [] e in un altro è un tipo interno opaco.

Ciò che funziona è semplicemente la visualizzazione dei campi, ad esempio un'espressione come this.length funziona come previsto. Inoltre, un'espressione come this restituisce semplicemente il nodo, affermando che il suo tipo è byte [] e il suo id oggetto è uguale all'ID originale.

+0

Sembra quasi Idea sta cercando di box auto il tipo e sta fallendo. Puoi aggiungere alla domanda che cosa succede se provi a inscatolare manualmente le primitive in java.lang.Byte [] e a rivalutare l'espressione? –

+0

Aggiunti alcuni dettagli. Non c'è conversione da _Dummy _.__ Array__ a qualsiasi tipo di java.lang di cui sono a conoscenza :-). – Kenny

risposta

0

Ho risposto a similar question here. Il messaggio relativo all'impossibilità di trasmettere a byte[] suona come un errore IntelliJ in cui non è possibile determinare il nome della classe nello stack di chiamate. Forse l'aggiunta di DTR per altri "moduli" di byte[] aiuterà. Ho incluso esempi di tre DTR di seguito: byte[], Byte[] e ArrayList.

Il test e il metodo di supporto (scritto in Groovy, in modo da assicurarsi che sia sul classpath o riscrivere in puro Java):

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

Per ogni DTR si desidera definire, basta copiare la stringa esatta definita sopra nel Quando si esegue il rendering di un nodo> Usa il seguente campo di espressione. Suggerirei di inserire il metodo di utilità in una classe di origine sul classpath rispetto a un test, poiché su ogni build sarà necessario reimportare la classe di test nella finestra di dialogo DTR perché il target/ viene pulito.

Successful test execution

DTR for ArrayList in action

Problemi correlati