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