【问题标题】:Data Type Renderers in Intellij?Intellij 中的数据类型渲染器?
【发布时间】:2018-08-14 23:46:47
【问题描述】:

最近转换为 Intellij。 Eclipse 在调试器中有一个特性“Primitive Display Options”,它具有调试器以十六进制和 ascii 值呈现原语。

由于到目前为止 Intellij 中的一切都很顺利,我认为这将是一件轻而易举的事,但是在一个小时后,以及一些非功能性数据类型渲染之后,我发现自己准备好爬回 eclipse。我制作了一些有效的渲染器,但仅适用于对象,所以我只能得出结论,渲染器似乎不适用于基元。有人可以在这里指出我正确的方向吗?

编辑:我已经看到在默认渲染中选择十六进制的选项,但我希望的不仅仅是一个需要为每个变量单击 2 次的解决方案。

【问题讨论】:

  • 嗯。这是 IDE 的一个有趣功能,在我发现您的问题之前,我不知道或不关心使用它。我将对此进行研究,看看它可以提供什么。虽然,坦率地说,调试器中原始值的默认视图确实是我所见过的最好的视图,即使在与 Eclipse 和 Netbeans 进行比较之后也是如此。
  • 谢谢!它对于我做的一些文件格式反转和 ByteBuffer 类型的工作来说是无价的。在 Eclipse 中,我可以检查字节数组或底层 ByteBuffer,并且可以立即看到正在读取或写入的数据中的 ascii 或字节模式。这几乎让我无法切换到 intellij。
  • 对我来说也一样,我真的需要这个功能来进行低级调试。我还用 IntelliJ 自定义渲染器摆弄了几个小时。 :-(

标签: java intellij-idea


【解决方案1】:

我的解决方案是使用byte[] 的以下表达式提供自定义数据类型渲染器:new String(Hex.encode(this));

只要启用数据类型渲染器(在应用程序重新启动等时保持状态),默认情况下就可以使用。如果您愿意,您可以添加更精细的字符串格式(我通常有一个实用程序类来进行进一步的格式设置,我只是从 DTR 表达式字段中调用它)。

【讨论】:

  • 这是一个接近的解决方案,但它仍然很尴尬(对于长数组大多不可用)
  • Hex 类来自哪个库?在 rt.jar 中找不到
  • 在这种情况下,它可能是我编写的自定义类,但任何来自 commons-codec 或 BouncyCastle 的十六进制转换器类只要在类路径上就可以工作。
  • 我在屏幕截图中完全一样,但在屏幕截图中,byte[] 标记为红色,intellij 抱怨意外令牌。在表达式中它抱怨“this”并声称它是空的。
  • 使用 this 关键字。我明白了!
【解决方案2】:

对于整数值(即既不是浮点值也不是布尔值),您可以通过在调试器中右键单击原语并选择“查看为”->“十六进制”来将它们视为十六进制值。

默认情况下,Data Type Renderer 功能仅适用于对象,而表示基元的唯一现实方法是以其整数值或十六进制表示,所以我认为这是一个愉快的折衷方案。

【讨论】:

  • 我应该提到我也发现了该功能,但我不想每次想要查看十六进制值时都必须切换它。我什至希望找到一些东西来默认启用它,但没有找到。
  • 尽管我不喜欢它,但手动切换此功能似乎是我设法使其工作的唯一方法。
  • @Kyle,请参阅 设置 > 构建、执行、部署 > 调试器 > 数据视图 > Java > "Show hex value for primitives"
【解决方案3】:

在数据视图选项下有一个选项(复选框)可以永久更改所有基元以显示为 Hex。见:

设置 > 构建、执行、部署 > 调试器 > 数据视图 > Java强> >

"Show hex value for primitives"

【讨论】:

    【解决方案4】:

    我制作了一些可以工作的渲染器,但仅适用于对象,所以我可以 只能得出渲染器似乎不适用于基元的结论。

    借助 IDEA 2016.3,终于可以为原始类型(包括数组)定义自定义 Java 数据类型渲染器。

    https://www.jetbrains.com/idea/whatsnew/#v2016-3

    【讨论】:

    • 对原始类型使用 Java 数据类型渲染器,我能够使用这个表达式来查看所有整数的十进制和十六进制值: this + " [" + String.format("0x%08x ", 这个) + "]"
    【解决方案5】:

    对于基于 IntelliJ 的 IDE,您还可以尝试 DeltaHex Editor plugin,它可以在调试器中显示带有典型十六进制 + 文本预览的窗口,用于字节数组。

    插件在设置/插件/浏览存储库/搜索 DeltaHex 中可用

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • pushkin:添加了如何安装插件的方法。但我相信答案之前已经是描述性的。也许您在将图片链接替换为图片之前没有注意到答案的文字?
    【解决方案6】:

    这类似于 Andy 的解决方案,但不需要您定义 Hex 类(他甚至没有提及)。仅适用于 Java8 项目(即目前不适用于 Android)。

    您必须使用以下表达式为byte[] 提供自定义数据类型渲染器(请参阅Andy's answer):

    IntStream.range(0,Math.min((this.length+3)/4,20)).mapToObj(i->IntStream.range(i*4,Math.min(i*4+4,_this.length)).mapToObj(i1->String.format("%02x",_this[i1])).collect(Collectors.joining())).collect(Collectors.joining(" "))+(this.length>80?"...":"")
    

    它会将数据格式化为“01020304 05060708 09”,即按四个分组并用空格分隔。仅显示前 80 个字节,如果有更多则添加省略号。

    【讨论】:

    • 他引用的 Hex 类可能来自 Shiro 或 apache-commons 项目之一,很多项目已经在类路径上。
    • 这对我不起作用:无法评估表达式 不支持 Lambdas 评估
    猜你喜欢
    • 2014-11-10
    • 2021-05-07
    • 2016-03-15
    • 2023-04-03
    • 2017-08-12
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多