【问题标题】:How to use Data Type Renderers list for byte[] in IntelliJ如何在 IntelliJ 中为 byte[] 使用数据类型渲染器列表
【发布时间】:2014-11-10 21:40:31
【问题描述】:

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

所以我已经看到了如何使用表达式new String(this) 渲染节点,但是这在下面的表达式列表视图中不起作用。最终我想做new String(this, "UTF16")之类的表达式(或转换为十六进制或base64或w/e)但this在表达式列表框中似乎不是一个字节[] - 事实上,当我尝试像(byte[])this 这样的类型转换结果显示Inconvertible types; cannot cast '_Dummy_.__Array__≤T≥' to 'byte[]'(java.lang.Byte[] 的行为相同)。这真是奇怪的行为,在一个地方它是一个字节[],而在另一个地方它是一些不透明的内部类型。

起作用的只是显示字段 - 即,像 this.length 这样的表达式可以按预期工作。此外,像 this 这样的表达式只是重新渲染节点,声称它的类型是 byte[] 并且它的对象 id 与原始的 id 相同。

【问题讨论】:

  • 这几乎听起来像 Idea 正在尝试自动装箱并且失败了。如果您尝试手动装箱 java.lang.Byte[] 中的原语并重新评估表达式,您能否补充一下问题?
  • 添加了一些细节。没有从 Dummy.__Array__ 到我知道的任何 java.lang 类型的转换:-)。

标签: java intellij-idea intellij-13


【解决方案1】:

我回复了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/ 已被清除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多