前几天我遇到了sun.misc.Unsafe包裹,并对它能做什么感到惊讶.
当然,这门课没有证件,但我想知道是否有充分的理由使用它.您可能需要使用哪些场景?它如何在现实场景中使用?
此外,如果您确实需要它,那是否表明您的设计可能出现问题?
为什么Java甚至包括这个类?
请看下面的图片.当我们用java创建一个带有new关键字的对象时,我们从OS获取一个内存地址.
当我们写作时,new我们可以看到一个"特殊"字符串作为输出.我的问题是:
如果是操作系统给我们的内存地址:
a)如何将此字符串转换为二进制?
b)如何获得一个整数变量地址?

昨天我参加了一家知名欧洲公司的CTO的演讲,直到最近他才知道java有指针.在面对他时,他说他绝对肯定java中存在指针/不安全代码.
有没有办法获取Java对象的地址?
问题来自哪里?:首先,我读取属性文件,文件中的所有数据都放在表格中.属性文件可以更新.所以,我想听那个文件.我使用PropertyChangeSupport和PropertyChangeListener监听对象.
updatedStatus = new basit.data.MyString();
updatedStatus.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
//After changes "i", we inform the table model about new value
public void propertyChange(PropertyChangeEvent evt) {
Object objec=evt.getNewValue();
tableModel.setValueAt(objec.toString(), 0, 5);
}
});
Run Code Online (Sandbox Code Playgroud)
如果updatedStatus更改,那么我更新表.MyString类具有私有字符串"Value".我想听属性文件.因此,它应该使updatedStatus.value和属性文件的字符串在相同的地址相等.如果我能做到,所以我不需要听属性文件.
updatedStatus.setValue(resourceMap.getString("HDI.Device.1.Name"));
Run Code Online (Sandbox Code Playgroud)
我试图使用StringBuffer,但我无法实现它.这就是为什么,我问了这个问题.
为了某些研究目的,我想提取java对象的实际地址.为了清楚起见,我实际上想要对象的48位虚拟地址,而不是ID或哈希码或任何唯一标识符,我理解这些地址是由GC移动的.我一直在阅读stackoverflow中的其他帖子,就像这里或这里一样.
对于以下我使用@Peter Lawrey - >有没有办法获得参考地址?方法.所以它使用Unsafe该arrayBaseOffset方法的类.我对这些方法感到奇怪的是,它们为每次运行(至少在我的计算机上)给出相同的结果,这是不太可能发生的.出于安全原因,应该将内存分配随机化.
此外,我尝试使用Pintools验证这些方法,这是英特尔的仪器工具,我用它来提取运行的内存痕迹.我的问题是我无法将我在Pintools的内存跟踪中看到的内容与上述方法给出的地址相关联以获取内存地址.在我的内存跟踪中永远不会访问给定的地址.
所以我想知道这些方法返回了什么,以及这些结果如何与其他工具进行验证.
一些信息:我的操作系统是Ubuntu x86_64,我的JVM是openJDK 64bits 1.8.0_131,pintools版本是v3.2
===================大编辑:我意识到我的问题并不好,所以让我得到一个更原子的例子,这是我尝试分析的java :
`import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class HelloWorld {
public static void main(String[] args) throws Exception {
Unsafe unsafe = getUnsafeInstance();
Integer i = new Integer(42);
long addr_fromArray;
long addr_fromObject;
/////////////////////////////////////
Object[] objects = {i};
long baseOffset = unsafe.arrayBaseOffset(Object[].class);
addr_fromArray = unsafe.getLong(objects, baseOffset);
long factor1 = 8;
long addr_withFactor = (unsafe.getInt(objects, baseOffset) & 0xFFFFFFFFL) * factor1; …Run Code Online (Sandbox Code Playgroud) 我有一个程序加载在内存中.现在我想直接访问内存并更改该程序内存中的OPCODE和DATA.为此,我需要编写一个Java程序.
你能告诉我这是否可行?如果是,请告诉我如何编写这样的程序.
提前致谢!