不安全的代码: 教你“随心所欲”地在内存中操作Java的类和对象(3)

5 篇文章 0 订阅
4 篇文章 0 订阅

原文地址:https://zeroturnaround.com/rebellabs/dangerous-code-how-to-be-unsafe-with-java-classes-objects-in-memory/3/

我们如何得到一个Class在内存中的地址呢?

说实话,要想获取一个Java类在内存中的地址没有什么好的方法。该取巧的地方取巧,该牺牲的东西也要牺牲。下面我们介绍两种方法。


方法1:在JVM中,每个对象都有一个指向其class的指针,但是只有指向实体类的指针,没有指向接口或抽象类的。如果我们得到了一个对象的地址,那么我们就可以很容易地得到其的类的。这种方法只对能实例对象的类受用。接口和抽象类不行!

For 32 bit JVM:
_mark : 4 byte constant
_klass : 4 byte pointer to class

For 64 bit JVM:
_mark : 8 byte constant
_klass : 8 byte pointer to class

For 64 bit JVM with compressed-oops:
_mark : 8 byte constant
_klass : 4 byte pointer to class

上面分别是在32位JVM、64位JVM和打开Compressed Oops选项功能 的64位JVM的内存中,对象部局(layout)的一部分。对象中的每二个域(field)是指向定义类的内存地址。为了得到这个域的值,你可以用“sun.misc.Unsafe”这个类。上一篇中提到的SampleClass在这里的使用方法如下:

For 32 bit JVM:
    SampleClass sampleClassObject = new SampleClass();  
    int addressOfSampleClass = unsafe.getInt(sampleClassObject, 4L);
For 64 bit JVM:
    SampleClass sampleClassObject = new SampleClass();
    long addressOfSampleClass = unsafe.getLong(sampleClassObject, 8L);
For 64 bit JVM with compressed-oops:
    SampleClass sampleClassObject = new SampleClass();
    long addressOfSampleClass = unsafe.getInt(sampleClassObject, 8L);

方法2:这个方法可是能获取任务类(包括:接口、匿名类、抽象类和枚举enum)的地址哦!!!在Java7中一个类的实际地址存放是这样的:对于32位JVM来说,放在了从开始80字节间距(原文用的是offset——位移,但是怕读者搞混,所以用了间距来表示。)之后的4个字节里;对于64位JVM来说,是160字节间距后的8个字节里;而对于开启了Compressed Oops的64位JVM来说是84字节间距后的的个字节中。

并且这些间距内没有被定义的内容,但是在文档中却被解析成”隐域”(其中有三个域:class, arrayClass, resolvedConstructor)。这也就是说,它们(地址)恰好就在那个offset下,因为在java.lang.Class中有18个非静态的引用域。
你可以通过ClassFileParser::java_Class_fix_pre()和JavaClasses::check_offsets()了解更多。传送入口:http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/classfile.

用来获取地址的样例代码如下:

For 32 bit JVM:
    int addressOfSampleClass = unsafe.getInt(SampleClass.class, 80L);

For 64 bit JVM:
    long addressOfSampleClass = unsafe.getLong(SampleClass.class, 160L);

For 64 bit JVM with compressed-oops:
    long addressOfSampleClass = unsafe.getInt(SampleClass.class, 84L);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 超声随心所欲是一款功能强大的音频编辑软件,它是专门为Windows 10系统设计的。它提供了丰富的音频编辑工具和效果,可以用于录音、剪辑、混音等应用。 超声随心所欲Win10版具有直观的界面和简单易用的操作方式,即使是初学者也可以轻松上手。它支持多种音频格式的导入和导出,用户可以根据自己的需要选择合适的格式进行保存和分享。 此外,超声随心所欲还提供了多种音频效果和滤波器,包括均衡器、压缩器、混响等。用户可以根据自己的喜好和需求对音频进行调整和优化,使其达到的音质和效果。 超声随心所欲Win10版还支持实时录音和实时效果处理,用户可以在录制音频的同时进行实时的音频编辑,方便快捷。此外,它还提供了多条音轨的支持,用户可以将不同的音频素材导入到不同的音轨,并进行混合和调整。 总而言之,超声随心所欲Win10版是一款功能齐全、操作简单的音频编辑软件,适用于Windows 10系统的用户。不论是专业人士还是音乐爱好者,都可以使用它来进行音频录制和编辑,实现自己的创作梦想。 ### 回答2: 超声随心所欲Win10版是一款流行的超声波探测仪器的软件。这个软件提供了许多功能和工具,使用户可以轻松地进行各种超声波实验和研究。 首先,超声随心所欲Win10版具有简单易用的界面,用户可以轻松找到需要的功能。软件提供了各种探头和传感器的选项,用户可以根据实验需求进行选择和配置。 其次,这个软件拥有强大的数据处理和分析功能。用户可以通过它来收集、存储和处理实验数据。软件提供了各种图表和图像分析工具,帮助用户好地理解实验结果,并做出准确的判断和决策。 此外,超声随心所欲Win10版还支持实时监测和追踪功能。用户可以实时观察实验过程的数据变化,以及相关参数的调整。这对于调整实验条件和获得准确的结果非常有帮助。 最后,超声随心所欲Win10版还具有多种导出和共享功能。用户可以将实验数据和分析结果导出为Excel、PDF或其他常见格式,方便与他人分享和合作。 总的来说,超声随心所欲Win10版是一款功能丰富、易于使用的超声波探测软件。它的便捷性和强大的数据处理功能使得用户可以好地进行超声波实验和研究。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值