java - 如何在 IntelliJ 中为 byte[] 使用数据类型渲染器列表

标签 java intellij-idea intellij-13

所以我有所有这些 byte[],它们的编码可能是许多不同格式中的一种,这取决于我当前正在调试的位置。我希望能够将字节数组的投影列表放在一起。我正在使用 IntelliJ 的数据类型渲染器 View ,将渲染器应用于类型 byte[],我主要关注表达式列表框。

所以我已经了解了如何使用表达式 new String(this) 呈现节点,但是这在下面的表达式 ListView 中不起作用。最终我想做像 new String(this, "UTF16") 这样的表达式(或者转换为 hex 或 base64 或 w/e)但是 this 似乎没有是表达式列表框中的 byte[] - 事实上,当我尝试像 (byte[])this 这样的类型转换时,结果显示 Inconvertible types;无法将 '_Dummy_.__Array__≤T≥' 转换为 'byte[]'(与 java.lang.Byte[] 的行为相同)。这真的很奇怪,在一个地方它是一个 byte[] 而在另一个地方它是一些不透明的内部类型。

起作用的只是显示字段 - 即,像 this.length 这样的表达式按预期工作。此外,像 this 这样的表达式只是重新呈现节点,声明其类型为 byte[] 并且其对象 ID 与原始 ID 相同。

最佳答案

我回答了一个similar question here .无法转换的提示_Dummy_.__Array__<T>byte[]听起来像是一个 IntelliJ 错误,它无法确定调用堆栈中类的名称。或许为 byte[] 的其他“形式”添加 DTR会有所帮助。我在下面包含了三个 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)
}

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

Successful test execution

DTR for ArrayList in action

关于java - 如何在 IntelliJ 中为 byte[] 使用数据类型渲染器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25880632/

相关文章:

java - 如何在 Java Swing 中拥有可折叠/可展开的 JPanel

java - 蛮力法寻找素数

intellij-idea - 如何在IntelliJ Idea中搜索项目的所有文件?

maven - 在 intellij 14 行找不到可执行代码

java - 错误 :java: invalid source release: 8 in Intellij. 是什么意思?

intellij-idea - 永久排除 IntelliJ 中的目录

java - Clojure 中的分数矩阵幂

java - Spring Data 未更新最新数据

java - 从 IntelliJ(社区版)连接到 Microsoft SQL Server

java - 如何在 IntelliJ IDEA 13 中将存储库添加到 "Indexed Maven Repositories"?