gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:37:33 24 4
gpt4 key购买 nike

所以我有所有这些 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com