jvm 宕机 打印jvm_通过入侵JVM打印阵列

jvm 宕机 打印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

jvm 宕机 打印jvm

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

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

相关文章

python数码时钟代码_Python+Pyqt实现简单GUI电子时钟

本文实例为大家分享了PythonPyqt实现简单GUI电子时钟的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面&#xff0c;利用pyqt模块也很方便&#xff0c;代码如下&#xff1a; from PyQt5.QtGui import * from PyQt5.QtCore im…

两个人投票的c语言程序,设计网页投票器(二)《精通Unix下C语言编程与项目实践》之十...

本处设计一个网页投票器&#xff0c;它访问“www.zhiliaowang.com”上的服务程序“/toupiaoceshi.asp”&#xff0c;并通过“name”参数向选手投票。如代码15-16所示&#xff1a;代码15-16网页投票器(节自/code/chapter15/http1.c)#include char buf2[]/*组装HTTP协议GET请求报…

【WebRTC---入门篇】(八)WebRTC核心之RTP Medio 媒体控制与数据统计

RTCPeerConnection底层是通过RTP Medio实现的,处理真正数据传输,编码流量各种控制的实现。 Receiver 通过 getReceivers 可以获取一组RTCRtpReceiver对象,用于接收数据 Sender 通过getSenders 可以获取一组RTCRtpSender对象,用于发送数据,每个对象对应一个媒体轨 RTCR…

事件驱动程序设计_简单的事件驱动设计

事件驱动程序设计总览 开发人员经常询问系统或其代码的性能或效率。 这到底是什么意思&#xff1f; 我的代码是如此高效&#xff0c;只有编码神能理解它的工作原理。 我的代码确实很聪明&#xff0c;但是却难以维护。 下一位开发人员将继续重写它。 我的代码对机器确实很有效…

python语言中的单行注释语句_Python 1基础语法一(注释、行与缩进、多行语句、空行和代码组)...

#第一个注释 print ("Hello, Python!") #第二个注释 输出结果为&#xff1a;RESTART: E:/python/change.py Hello, Python! 多行注释可以用多个 # 号&#xff0c;还有 和 """&#xff1a;实例如下&#xff1a; #第一个注释#第二个注释 第三注释 第四…

c语言文件的读写通讯录,学C三个月了,学了文件,用C语言写了个通讯录程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #include struct QQ //结构体&#xff0c;有6个成员{char name[20];char age[5];char tel[15];char qq[15];char birth[12];char address[80];}user;void style()//窗口风格函数{system("mode con…

【WebRTC---入门篇】(九)WebRTC网络基础:P2P/STUN/TURN/ICE

NAT 作用:内网地址转公网地址 STUN 作用:中介将公网信息彼此交换 TURN 作用:P2P不成功的话在云端架设服务器,双方进入同一房间。可以在一起进行数据交互 ICE 作用:打包以上取最优,先尝试P2P。如果P2P不通再选择TURN。ICE尝试所有可能性 Relay是TURN Server,大多数情况…

antlr4例子_ANTLR和网络:一个简单的例子

antlr4例子网络上的ANTLR&#xff1a;为什么&#xff1f; 我开始在MS-DOS上编写我的第一个程序。 因此&#xff0c;我非常习惯在自己的机器上安装工具。 但是在2016年&#xff0c;网络无处不在&#xff0c;因此那里也可能需要我们的语言。 可能的情况&#xff1a; ANTLR 也在…

python 形参_python中参数总结

一、形参和实参 函数参数的作用是传递数据给函数使用。 在使用的过程中&#xff0c;参数有两种形式&#xff1a;形式参数和实际参数 形参&#xff1a;定义函数时的参数 实参&#xff1a;调用函数时的参数 根据实际参数类型不同&#xff0c;将实际参数传递给形参的方式有两种&am…

【WebRTC---入门篇】(十)NAT

NAT主要用于内网穿透 NAT产生原因 NAT的种类 NAT穿越原理 完全锥型:内网主机先向外发送一个请求形成IP和port

linux安装mq报5724,小白提问:linux安装MQ出现的错误

在安装MQ中遇到以下问题&#xff0c;求大神帮助# ./mqlicense.sh -acceptLicensed Materials - Property of IBM 5724-H72 (C) Copyright IBM Corporation 1994, 2009 All rights reserved.US Gover...显示全部在安装MQ中遇到以下问题&#xff0c;求大神帮助…

maven java1.7_本周Java技巧#7 – Maven慢吗?

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

vector 删除指定元素_std::vector简介

引入使用vector&#xff0c;需添加头文件#include<vector>&#xff0c;要使用sort或find&#xff0c;则需要添加头文件#include<algorithm>。简介vector是表示可以改变大小的数组的序列容器。就像数组一样&#xff0c;vector使用连续存储空间存储元素&#xff0c;这…

【WebRTC---入门篇】(十一)STUN协议

STUN作用:用于NAT穿越;它是典型的CS模式 RFC STUN规范 STUN header STUN Header格式

linux dd iflag oflag,centos – dd oflag =直接5倍速

我在这个规格的服务器中有Centos 6.2&#xff1a;2xcpu 16 Core AMD Opteron 6282 SE64GB RAMRaid controller H700 1GB cache NV- 2HD 74GB SAS 15Krpm RAID1 stripe 16k (OS Centos 6.2) sda- 4HD 146GB SAS 15Krpm RAID10 stripe 16k (ext4 bs 4096,no barriers) sdb -> …

mysql数据迁移到sqlserver_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...

这是一个.net下操作数据库(结构数据库)的工具类&#xff0c;支持sqlserver、oracle、mysql、postgres、sqlite、access等常见数据库。注意&#xff1a;它并不是一个orm工具(常见的orm框架如&#xff1a;EF、Dapper等)。2.1 引入DBUtil依赖1. 首先打开vs(推荐vs2019)&#xff0c…

【H.264/AVC视频编解码技术】第二章【H264码流分析】

H264码流分层 NAL层,视频数据网络抽象层,作用是控制二进制数据的传输,主要用于网络传输。 VCL层,视频数据编码层。 VCL结构关系 NALU NAL Header (1B)+ RBSP H264码流中NALU sps pps IDR帧的理解 概念 什么是NALU? H264码流可以分为两层,VCL层和NAL层,NAL的全称…

jcmd_程序化JCMD访问

jcmd在线提出的问题表明&#xff0c;开发人员偶尔会希望通过Java应用程序访问通常从针对应用程序外部运行JConsole &#xff0c; VisualVM或JDK命令行工具获得的信息类型。 以下是这类问题的一些示例&#xff1a; 如何以编程方式获取jmap直方图&#xff1f; 以编程方式从Java…

android相册管理,Piktures - 最优雅的相册管理 - Android 应用 - 【最美应用】

多维度管理&#xff0c;美到每一个细节Piktures 的优雅&#xff0c;首先在于其浏览、管理的维度设计上。Android 原生相册最为人所诟病的就是其乱糟糟的浏览体验&#xff0c;所有带图片的文件夹都毫无章法地直接呈现。而 Piktures 则做了全面的改进。左滑即开打开文件夹管理模式…

【H264码流分析】 SPS/PPS/Slice Header

SPS中相关 H264 Profile 对视频压缩特性的描述&#xff0c;Profile越高&#xff0c;就说明采用了越高级的压缩特性 H264 Level Level是对视频的描述,Levrl越高&#xff0c;视频的码率&#xff0c;分辨率&#xff0c;fps越高 分辨率 帧相关 帧率计算 PPS Slice Header