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

Java 如何在IntelliJ中使用字节[]的数据类型呈现器列表,java,intellij-idea,intellij-13,Java,Intellij Idea,Intellij 13,所以我有所有这些字节[],它们的编码可能是许多不同格式中的一种,这取决于我当前调试的位置。我希望能够为字节数组拼凑出一个投影列表。我使用IntelliJ的数据类型渲染器视图,将渲染器应用于byte[]类型,我主要关注表达式列表框 因此,我已经了解了如何使用表达式新字符串(this)渲染节点,但是在下面的表达式列表视图中,这不起作用。最后,我想做一些表达式,比如newstring(这个“UTF16”)(或者转换成十六进制、base64或w/e),但是这个在表达式列表框中似乎不是一个字节[],事实上

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

因此,我已经了解了如何使用表达式
新字符串(this)
渲染节点,但是在下面的表达式列表视图中,这不起作用。最后,我想做一些表达式,比如
newstring(这个“UTF16”)
(或者转换成十六进制、base64或w/e),但是
这个
在表达式列表框中似乎不是一个字节[],事实上,当我试着像
(byte[])这样进行类型转换时,结果显示
不可转换类型;无法强制转换“\u伪数组”。\u__≤T≥' 到“byte[]”
(与java.lang.byte[]的行为相同)。这是非常奇怪的行为,在一个地方是byte[],在另一个地方是不透明的内部类型

工作原理是简单地显示字段,即像
this.length
这样的表达式按预期工作。此外,类似于
this
的表达式只是重新命名节点,声称其类型为byte[],其对象id与原始id相同。

我回答了一个问题。关于无法将
\u Dummy.\uu数组\uu
强制转换为
字节[]
的消息听起来像是一个IntelliJ错误,无法确定调用堆栈中类的名称。也许为
字节[]
的其他“形式”添加DTR会有所帮助。我在下面列出了三个DTR的示例--
byte[]
byte[]
ArrayList

测试和助手方法(用Groovy编写,因此请确保它位于类路径上或用纯Java重写):

@测试
void testShouldHandleDTR(){
//安排
byte[]primitiveArray=“90abcdef”。字节
Byte[]objectArray=“90abcdef”。字节
List objectList=“90abcdef”。字节
应为最终字符串\u String=Hex.encodeHexString(primitiveArray)
info(“预期的十六进制字符串:${预期的字符串}”)
//完全符合DTR对话框的要求
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表达式=[(primitiveArray.class.name):primitiveDTR,
(objectArray.class.name):objectArrayDTR,
(objectList.class.name):objectListDTR]
//表演
types.each{it->
info(“内容:${it}”)
logger.info(“类型:${it.class.name}”)
String result=Eval.x(it,表达式[it.class.name].replaceAll(/this/,“x”))
info(“结果:${Result}”)
//断言
断言结果==预期的\u字符串
}
}
公共静态字符串encodeObjectArrayToHex(对象[]objectArray){
byte[]primitiveArray=objectArray.collect{it as byte}
十六进制编码十六进制字符串(基元数组)
}
对于要定义的每个DTR,只需将上面定义的精确字符串复制到渲染节点>使用以下表达式时的字段中。我建议将实用工具方法放入类路径上的源类中,而不是测试,因为在每个构建中,您都必须在DTR对话框中重新导入测试类,因为
target/
会被清除


听起来Idea试图自动装箱,但失败了。如果您尝试手动装箱java.lang.Byte[]中的原语并重新计算表达式,会发生什么?添加了一些细节。没有从Dummy.\uuuu Array\uuuuu到我所知道的任何java.lang类型的转换:-)。
@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)
}