如何在IntelliJ中使用byte []的数据类型呈现器列表

Ken*_*nny 7 java intellij-idea intellij-13

所以我有所有这些byte []的,它们的编码可能是许多不同格式之一,具体取决于我当前正在调试的位置.我希望能够将字节数组的投影列表组合在一起.我正在使用IntelliJ的数据类型呈现器视图,应用渲染器来键入byte [],我主要关注表达式列表框.

所以我已经看到了如何使用表达式呈现节点new String(this),但是这在下面的表达式视图列表中不起作用.最后,我想去做的表达式new String(this, "UTF16")(或者说转换为十六进制或Base64或W/E),但this似乎并没有成为一个byte []中的表达式列表框中-事实上,当我试图像强制转换(byte[])this的结果说Inconvertible types; cannot cast '_Dummy_.__Array__?T?' to 'byte[]'( java.lang.Byte [])的相同行为.这真是奇怪的行为,在一个地方它是一个字节[]而在另一个地方它是一些不透明的内部类型.

什么工作只是显示字段 - 即表达式像this.length预期的那样工作.此外,表达式this只是简单地重新呈现节点,声称其类型为byte [],其对象id与原始id相同.

And*_*ndy 0

在这里回答了类似的问题_Dummy_.__Array__<T>有关无法转换为的消息byte[]听起来像是一个 IntelliJ 错误,它无法确定调用堆栈中的类的名称。也许为其他“形式”添加 DTRbyte[]会有所帮助。我在下面提供了三个 DTR 的示例 - byte[]Byte[]ArrayList

测试和辅助方法(用 Groovy 编写,因此请确保它位于类路径中或用纯 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)
}
Run Code Online (Sandbox Code Playgroud)

对于要定义的每个 DTR,只需将上面定义的确切字符串复制到“渲染节点时 > 使用以下表达式”字段中。我建议将实用程序方法放入类路径上的源类中,而不是测试中,因为在每个构建中,您都必须在 DTR 对话框中重新导入测试类,因为测试类会被target/清理。

测试执行成功

ArrayList 的 DTR 实际应用