通过入侵JVM打印阵列

总览

Java中最常见的陷阱之一就是知道如何打印数组。 如果有关如何打印阵列的答案获得了超过1000票赞成票,那么您必须怀疑是否有更简单的方法。 几乎所有其他流行语言都具有这种更简单的方法,因此我不清楚Java为什么仍会这样做。

与其他JDK类不同,数组没有特别健全的toString(),因为它是从Object继承的。

它打印类型和地址吗?

实际上,它不打印地址,只是看起来像一个地址一样。 它打印类型的内部表示以及对象的hashCode() 。 由于所有数组都是对象,因此它们具有hashCode()和类型以及同步锁,而对象具有的其他所有内容,但是没有特定于数组的方法。 这就是为什么toString()对数组没有用的原因。

看起来没有什么变化?

如果我运行以下程序。

public class ObjectTest {boolean[] booleans = {true, false};byte[] bytes = {1, 2, 3};char[] chars = "Hello World".toCharArray();short[] shorts = {111, 222, 333};float[] floats = {1.0f, 2.2f, 3.33f, 44.44f, 55.555f, 666.666f};int[] ints = {1, 22, 333, 4_444, 55_555, 666_666};double[] doubles = {Math.PI, Math.E};long[] longs = {System.currentTimeMillis(), System.nanoTime()};String[] words = "The quick brown fox jumps over the lazy dog".split(" ");@Testpublic void testToString() throws IllegalAccessException {Map<String, Object> arrays = new LinkedHashMap<>();for(Field f : getClass().getDeclaredFields())arrays.put(f.getName(), f.get(this));arrays.entrySet().forEach(System.out::println);}
}

它打印。

booleans=[Z@277c0f21
bytes=[B@6073f712
chars=[C@43556938
shorts=[S@3d04a311
floats=[F@7a46a697
ints=[I@5f205aa
doubles=[D@6d86b085
longs=[J@75828a0f
words=[Ljava.lang.String;@3abfe836

我认为这对每个人都是显而易见的。 O_O喜欢的事实,J是一个翁内部码和L为的J ava类的内部码。 当b未使用时, Z也是布尔值的代码。

我们对于它可以做些什么呢?

在此程序中,我们最终不得不编写一个特殊的toString方法,以供需要通过打印Map.Entry的特殊方法调用对象时使用。 重复此操作多次可以提高程序的吞吐量,并且避免在Java中使用数组很容易,因为它们很难调试。

黑客JVM呢?

我们可以做的就是更改Object.toString()。 我们必须更改此类,因为它是我们有权访问的数组的唯一父级。 我们无法更改数组的代码,因为它是JVM内部的。 例如,对于所有byte []特定方法,没有byte [] Java类文件。

取得java.lang.Object的源代码副本,并将toString()替换为

public String toString() {if (this instanceof boolean[])return Arrays.toString((boolean[]) this);if (this instanceof byte[])return Arrays.toString((byte[]) this);if (this instanceof short[])return Arrays.toString((short[]) this);if (this instanceof char[])return Arrays.toString((char[]) this);if (this instanceof int[])return Arrays.toString((int[]) this);if (this instanceof long[])return Arrays.toString((long[]) this);if (this instanceof float[])return Arrays.toString((float[]) this);if (this instanceof double[])return Arrays.toString((double[]) this);if (this instanceof Object[])return Arrays.deepToString((Object[]) this);return getClass().getName() + "@" + Integer.toHexString(hashCode());}

在Java <= 8中,我们可以通过添加到命令行将此类添加到bootclasspath的开头

-Xbootclasspath/p:target/classes

(或您的类已编译到的任何位置),现在当我们运行程序时,

booleans=[true, false]
bytes=[1, 2, 3]
chars=[H, e, l, l, o,  , W, o, r, l, d]
shorts=[111, 222, 333]
floats=[1.0, 2.2, 3.33, 44.44, 55.555, 666.666]
ints=[1, 22, 333, 4444, 55555, 666666]
doubles=[3.141592653589793, 2.718281828459045]
longs=[1457629893500, 1707696453284240]
words=[The, quick, brown, fox, jumps, over, the, lazy, dog]

就像您使用其他任何语言一样。

结论

虽然这是一个很酷的技巧,但是最好的解决方案是他们最终修复Java,以便为数组生成合理的输出。 它知道您需要一个并提供它,但是将其隐藏在您必须通过Google查找的类中,以便每个新的Java开发人员在第一次尝试使用数组时都必须拥有一个WTF时刻。

翻译自: https://www.javacodegeeks.com/2016/03/printing-arrays-hacking-jvm.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一种同于计算机键盘的测试装置,一种计算机键盘按键测试装置

主权项&#xff1a;1.一种计算机键盘按键测试装置&#xff0c;包括顶架以及固定安装在顶架正下方的测试机&#xff0c;其特征在于&#xff1a;顶架底面与测试机顶面之间固定连接有连接架&#xff0c;测试机内设有敲打装置和除尘装置&#xff0c;敲打装置包括设置在测试机左侧底…

SQL Server 索引重建手册

注意&#xff1a;索引重建前建议把数据库切换为完整模式&#xff0c;否则索引复制会在数据文件中进行&#xff0c;导致数据文件很大&#xff0c;而数据文件的收缩比日志文件的收缩要困难的多&#xff0c;且会对业务造成影响。步骤一:查询索引碎片&#xff0c;脚本如下&#xff…

三角形面积计算机方法,数学知识点:三角形面积的计算

原标题&#xff1a;数学知识点&#xff1a;三角形面积的计算复习&#xff11;、说说长方形、平行四边形的面积计算公式。长方形的面积长宽平行四边形的面积底高2、 计算下面长方形和平行四边形的面积&#xff0e;生活中常见的三角形思考 :怎样应用所学的方法探究三角形的面积计…

mysql学习第二天

alter tables转载于:https://www.cnblogs.com/hanxue112253/p/7657309.html

apache camel_令人印象深刻的第一个Apache Camel版本

apache camel在准备下周的CamelOne会议时&#xff0c;我花了一些时间回顾一下Apache Camel项目的历史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一个正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;这个版本的事实给我留下了深刻的印…

notion自建服务器,【速报】Notion的特色「双向链接」方案来了,Synced Block 登场...

Notion 作为一款出色的「聚合型」(All-In-One)笔记 App&#xff0c;在这几年里逐渐获得了不少知识工作者的宠爱。在以前&#xff0c;大家一般会高度赞扬 Notion 的「模块化」编辑器&#xff0c;但同时也会好奇什么时候 Notion 可以带来像Roam Research 那样的 「双向链接」功能…

English 动词篇

动词后加to do 和 doing的记忆口诀 一、只能用动名词(ing)作宾语 [口诀] 考虑建议盼原谅&#xff0c;承认推迟没得想。 避免错过继续练&#xff0c;否定完成停欣赏。 禁止想象才冒险&#xff0c;不禁介意弃逃亡。 consider考虑suggest建议/advocate 提倡主张look forw…

本周Java技巧#7 – Maven慢吗?

本周Java本周技巧是有关Maven的上一期的后续内容。 第一个视频介绍了与Maven依赖关系有关的方面。 该视频将介绍一些加快Maven构建速度的技术。 Maven慢吗&#xff1f; 从Maven 3开始&#xff0c;您可以并行运行构建。 根据构建机器和项目结构的不同&#xff0c;您可能会获得6…

华北电力大学的计算机类专业排名,2018年华北电力大学王牌专业排行榜,考生和家长们都好好看看!...

华北电力大学有两个校区&#xff0c;一个是北京校区&#xff0c;一个是保定校区&#xff0c;在理科类的院校中&#xff0c;这所大学还是非常不错的&#xff0c;小编有幸去这个学校玩过几次&#xff0c;这个学校的占地面积非常大&#xff0c;环境相对比较优美&#xff0c;而且学…

剑指offer之 二叉搜索树的后续遍历序列

题目描述&#xff1a; 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 public class Solution {public boolean VerifySquenceOfBST(int [] sequence) {if(sequence.lengt…

11input/output

输出重定向 command1 > file1 vim test hello cat test who > users cat test echo "nihao" > test cat test 输入重定向 command1 < file1 wc -l test  统计行数 重定向深入了解 一般情况下&#xff0c;每个 Unix/Linux 命令运行时都会打开三个文件&a…

算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验

云服务器是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。通常来说&#xff0c;平台的每个集群节点被部署在互联网的骨干数据中心&#xff0c;可以独立提供计算、存储、在线备份、托管、带宽等互联网基础设施服务。关注的是高性能吞吐量计算能力&#xff0c;关注的是…

构建忽略测试_分类测试以减少构建时间

构建忽略测试在继续本文的主要内容之前&#xff0c;让我们先进行一些定义。 单元测试 单元测试是小型的&#xff08;测试一个用例或一个单元&#xff09;&#xff0c;在内存中运行&#xff08;不与数据库&#xff0c;消息队列等交互&#xff09;&#xff0c;可重复且快速的测试…

[Ctsc2014]企鹅QQ

3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MB[Submit][Status][Discuss]Description PenguinQQ是中国最大、最具影响力的SNS&#xff08;Social Networking Services&#xff09;网站&#xff0c;以实名制为基础&#xff0c;为用户提供日志、群、即时通讯…

ajax后台怎么取mapp,后台管理实现

京淘后台管理实现1.1 商品列表展现1.1.1 商品POJO对象1.1.2 表格数据页面结构1.1.3 请求URL地址说明&#xff1a;如果采用UI框架并且添加了分页插件&#xff0c;则会自动的形成如下的URL请求地址1.1.4 编辑ItemController1.1.5 编辑ItemService1.1.6 编辑ItemMapper手动编辑分页…

让工厂美丽

每个名副其实的Java程序员都知道Factory Pattern 。 这是一种便捷&#xff0c;标准化的方法&#xff0c;它通过教一个组件如何捕鱼而不是将它们交给它们来减少耦合。 但是&#xff0c;在使用大型系统时&#xff0c;该模式确实会向系统添加大量样板代码。 对于每个实体&#xff…

UVa10779 - Collectors Problem(最大流)

题目链接 简介&#xff1a;交换贴纸 分析&#xff1a; 这也算是一个天坑了 很久之前就看过这道题&#xff0c;但是一直没有填 美妙的建图&#xff1a; 我们用n-1个点表示每个除Bob之外的人 用m个点表示贴纸&#xff0c;从源点向这m个点连边&#xff0c;边的容量是Bob拥有该…

华为免费虚拟服务器,免费试用虚拟服务器

免费试用虚拟服务器 内容精选换一换本节操作介绍切换虚拟私有云的操作步骤。仅支持单网卡切换虚拟私有云。切换虚拟私有云会导致云服务器网络中断。切换虚拟私有云过程中&#xff0c;请勿操作云服务器的弹性公网IP&#xff0c;或对云服务器做其他操作。切换虚拟私有云后&#x…

esb 和mq_使用保险丝结构管理MQ和ESB的大型部署,第一部分

esb 和mqFuseSource最近发布了ActiveMQ和ServiceMix发行版的企业版。 其中的一些主要功能包括增量修补 &#xff0c; 自定义平台安装程序和第三方验证 。 新企业版附带的最酷的功能之一是Fuse Fabric和一些新工具 &#xff0c;使您可以利用Fabric管理环境。 Fabric允许您通过一…

centOS 阿里云yum地址配置

引用&#xff1a;http://mirrors.aliyun.com/help/centos?spm5176.bbsr150321.0.0.d6ykiD 1、备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/Cen…