`
qianshangding
  • 浏览: 129180 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

并行编程(2) - sum.msic.Unsafe 二

 
阅读更多

整理了几个以前从网上记录sum.msic.Unsafe类的示例,供大家参考:


package com.fish.unsafe;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import sun.misc.Unsafe;

/**
 * @version 1.0
 * @author Fish
 */
public class UnsafeTest {
	public static Unsafe unsafe;

	@Before
	public void init() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		// 通过反射获取rt.jar下的Unsafe类
		Field field = Unsafe.class.getDeclaredField("theUnsafe");
		field.setAccessible(true);
		unsafe = (Unsafe) field.get(null);
	}

	/**
	 * allocateInstance初始化对象不调用构造方法
	 * 
	 * @Description:
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testAllocateInstance() throws InstantiationException, IllegalAccessException {
		UnsafeClass un = new UnsafeClass(); // constructor
		System.out.println(un.a()); // prints 1
		UnsafeClass uu2 = UnsafeClass.class.newInstance(); // reflection
		System.out.println(uu2.a()); // prints 1
		UnsafeClass uu3 = (UnsafeClass) unsafe.allocateInstance(UnsafeClass.class); // unsafe
		System.out.println(uu3.a());// prints 0
	}

	/**
	 * 修改private变量的值
	 * 
	 * @Description:
	 * @throws NoSuchFieldException
	 * @throws SecurityException
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testObjectFieldOffset() {
		try {
			UnsafeClass un = new UnsafeClass();
			System.out.println(un.isEqual());
			Field f = un.getClass().getDeclaredField("a");
			unsafe.putInt(un, unsafe.objectFieldOffset(f), 42); // memory
			System.out.println(un.isEqual()); // true, access granted
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 获取对象的大小
	 * @Description: 
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testSizeof() {
		UnsafeClass un = new UnsafeClass();
		System.out.println(sizeOf1(un));
	}

	public static long sizeOf1(Object object) {
		HashSet<Field> fields = new HashSet<Field>();
		Class<?> c = object.getClass();
		while (c != Object.class) {
			for (Field f : c.getDeclaredFields()) {
				if ((f.getModifiers() & Modifier.STATIC) == 0) {
					fields.add(f);
				}
			}
			c = c.getSuperclass();
		}
		// get offset
		long maxSize = 0;
		for (Field f : fields) {
			long offset = unsafe.objectFieldOffset(f);
			if (offset > maxSize) {
				maxSize = offset;
			}
		}
		return ((maxSize / 8) + 1) * 8; // padding
	}

	/**
	 * 浅拷贝:该方法可以用来拷贝任何类型的对象,动态计算它的大小。
	 * 
	 * @Description:
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testShallowCopy() {
		List<String> list = new ArrayList<String>();
		list.add("123A");
		list.add("123B");
		list.add("123C");
		long size = sizeOf1(list);
		long start = toAddress(list);
		long address = unsafe.allocateMemory(size);
		unsafe.copyMemory(start, address, size);
		System.out.println(fromAddress(address));
	}

	private static long normalize(int value) {
		if (value >= 0)
			return value;
		return (~0L >>> 32) & value;
	}

	public static long toAddress(Object obj) {
		Object[] array = new Object[] { obj };
		long baseOffset = unsafe.arrayBaseOffset(Object[].class);
		return normalize(unsafe.getInt(array, baseOffset));
	}

	static Object fromAddress(long address) {
		Object[] array = new Object[] { null };
		long baseOffset = unsafe.arrayBaseOffset(Object[].class);
		unsafe.putLong(array, baseOffset, address);
		return array[0];
	}

	/**
	 * 密码隐藏:通常我们会将用完的密码设置为null,但是在设置为null到GC垃圾回收该对象,是有一定的时间。在这段时间内,该对象还存在于内存中,
	 * 就在这段时间内,很可能被黑客利用
	 * 
	 * @Description:
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testPassword() {
		String password = new String("l00k@myHor$e");
		String fake = new String(password.replaceAll(".", "?"));
		System.out.println(password); // l00k@myHor$e
		System.out.println(fake); // ????????????
		unsafe.copyMemory(fake, 0L, null, toAddress(password), sizeOf1(password));
		System.out.println(password); // ????????????
		System.out.println(fake); // ????????????
	}

	 /**
	 * 动态创建类
	 * @Description:
	 * @author Fish
	 * @date 2015年6月24日
	 */
	 @Test
	 public void testDynamicClasses() {
		 try {
			 File f = new File("D:\\A.class");
			 FileInputStream input = new FileInputStream(f);
			 byte[] content = new byte[(int) f.length()];
			 input.read(content);
			 input.close();
                         <span style="color:#FF0000;">// unsafe.defineClass(null, content, 0, content.length);该方法在JDK8找不到</span>
                        Class<?> c = unsafe.defineClass(null, content, 0, content.length);
			 c.getMethod("a").invoke(c.newInstance(), null); // 1
		 } catch (FileNotFoundException e) {
			 e.printStackTrace();
		 } catch (IOException e) {
			 e.printStackTrace();
		 }
	 }

	/**
	 * 大数组:这种方式的内存分配不在堆上,且不受GC管理,所以必须小心Unsafe.freeMemory()的使用
	 * @Description: 
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testBigArray() {
		long SUPER_SIZE = (long) Integer.MAX_VALUE * 2;
		SuperArray array = new SuperArray(SUPER_SIZE);
		System.out.println("Array size:" + array.size()); // 4294967294
		int sum = 0;
		for (int i = 0; i < 100; i++) {
			array.set((long) Integer.MAX_VALUE + i, (byte) 3);
			sum += array.get((long) Integer.MAX_VALUE + i);
		}
		System.out.println("Sum of 100 elements:" + sum); // 300
	}

}

class SuperArray {
	private final static int BYTE = 1;

	private long size;

	private long address;

	public SuperArray(long size) {
		this.size = size;
		address = UnsafeTest.unsafe.allocateMemory(size * BYTE);
	}

	public void set(long i, byte value) {
		UnsafeTest.unsafe.putByte(address + i * BYTE, value);
	}

	public int get(long idx) {
		return UnsafeTest.unsafe.getByte(address + idx * BYTE);
	}

	public long size() {
		return size;
	}
}

class UnsafeClass {
	private long a;

	public UnsafeClass() {
		this.a = 1;
	}

	public long a() {
		return this.a;
	}

	public boolean isEqual() {
		return 42 == a;
	}
}



分享到:
评论

相关推荐

    MSIC.zip_MSI_Overview_NTDDK.d_delphix_d7_msi_Machine.dcu_update

    【标题】"MSIC.zip_MSI_Overview_NTDDK.d_delphix_d7_msi_Machine.dcu_update" 涉及的是一个关于Delphi编程的项目,其中包含与MSI(Microsoft Installer)相关的源代码,可能是一个用于创建或修改安装程序的工具。...

    MSIC10.9.2.rar

    【标题】"MSIC10.9.2.rar" 提供的是一个软件更新或组件包,其中可能包含针对MSIC(Microsoft Installer Component)的版本10.9.2的修复和改进。MSIC是微软安装组件,用于在Windows操作系统上安装和管理应用程序。这...

    MSIC.zip_MSIC_MSIC FOR DELPHI20_MSIC delphi_delphi XML_mitec_usb

    "MSIC delphi"强调了这个组件与Delphi编程语言的紧密集成,而"mitec_usb"可能指的是mitec公司的USB相关技术或者库,用于处理USB设备通信。 【描述】中提到的“非常全面的计算机资源管理分析器”意味着这个压缩包...

    msic同步接收

    在本场景中,“msic同步接收”特指使用C#编程语言处理MSIC同步包的过程。C#是一种广泛应用于Windows平台开发的面向对象的编程语言,尤其在构建桌面应用、游戏以及服务器端解决方案时表现出色。以下将详细探讨如何在...

    mitec system information 10.7 full surce

    2. **操作系统信息**:显示操作系统版本、服务包、安装日期、激活状态等。 3. **网络信息**:获取网络适配器的详细信息,如IP地址、MAC地址、连接状态等。 4. **软件信息**:列出已安装的软件应用及其版本。 5. **...

    C语言头文件 MSI C语言头文件 MSI

    C语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言...

    andrpod TAB

    tbPlayMusic = (ToggleButton) findViewById(R.id.tb_msic); mediaPlayer = MediaPlayer.create(this, R.raw.nishiwodeyan);//指定了播放源 tbPlayMusic.setOnCheckedChangeListener(new CompoundButton....

    stm32f10xx.h

    Cortex-M4 Device Peripheral Access Layer Header File. This file contains all the peripheral register's definitions, bits definitions and memory mapping for STM32F4xx devices

    台达触摸屏和电脑连接通讯时出现no reponse from HMI报警的解决办法.docx

    2. **进入设置界面**:屏幕会跳转到设置菜单,用户可以通过左右翻页找到相关选项。 3. **找到MSIC选项**:在设置界面中,找到并点击人头+问号的图标,即"MSIC"选项。 4. **修改USB通信模式**:在MSIC的详细设置中...

    MiTeC.System.Information.Suite.v9.3.0.for.Delphi.Cracked.REP

    例如,"file_id.diz"通常是软件的简短描述文件,"MSIC.inf"可能是安装信息文件,"ssg.nfo"、"qqt.nfo"和"ReadMe.txt"通常包含使用说明和注意事项,"LICENSE.TXT"则详细规定了软件的使用许可条款,"Order.txt"可能...

    互联网 智能餐饮管理系统的实现.pdf

    智能餐饮管理系统是当前餐饮行业的必然趋势,为了满足客户的需求和提高餐饮企业的管理效率,需要开发一个基于互联网的智能餐饮管理系统(MSIC)。MSIC是基于互联网和移动智能设备的餐饮管理系统,通过API接口实现...

    台达DOP-B07S410触摸屏出现HMI no response无法上传的解决办法.docx

    而我们需要将其更改为模式2(CDC),即通信设备类模式,该模式允许触摸屏作为通信设备与电脑进行数据交换。 调整USB通讯模式为CDC后,不要忘记点击“退出”键来保存更改,并关闭系统设置界面。在完成设置更改之后,...

    浅谈互联网 智能餐饮管理系统的实现.pdf

    二、互联网智能餐饮管理系统(MSIC)的分析与设计 MSIC的架构设计采用B/S模式,同时使用三层架构,能够实现就餐者在任何地点和时间点餐下单的需求,另一方面,为餐厅企业提供了方便、快捷、高效、精确的相关信息...

    台达DOP系列触摸屏与电脑通讯不上时,如何进入系统设置画面修改系统设置从而正常通讯?.docx

    可以通过左右翻页找到带有MSIC标识(人头+问号图标)的设置。 4. 接着,点击“MISC”图标进入详细设置。 5. 在详细设置中,你会看到一个名为“USBcommMode”的选项。默认情况下,它可能设置为1(DISK)。要解决...

    以管理员身份运行程序

    #### 二、关键API介绍 1. **CreateProcessWithLogonW**:此函数用于以指定用户的上下文创建一个新进程。它允许开发者以具有不同登录会话的用户身份启动应用程序。 - **参数说明**: - `lpUserName`: 指向用户名...

    修改及备份注册表的基本方法

    #### 二、直接修改注册表的方法 对于熟悉注册表结构和技术的高级用户,可以直接使用注册表编辑器(Regedit)来修改注册表。具体步骤如下: 1. **获取注册表编辑器**:从Windows安装光盘的\Admin目录下复制Regedit....

    AHCI 1.3协议

    #### 二、概述 AHCI 1.3标准是对早期版本的一次重大更新,它引入了多项改进以提高性能和可靠性。此标准不仅适用于台式机也适用于服务器和其他高性能计算环境中的SATA设备。通过定义一系列寄存器和数据结构,AHCI允许...

    常用数字电路命名法则

    - **可编程逻辑器件(PLD)**:允许用户通过编程来定义逻辑功能的集成电路。 - **模拟阵列和数字模拟混合阵列**:同时包含模拟和数字功能的集成电路。 - **全定制集成电路**:完全根据用户的特定需求定制的集成...

    KeePass Password Safe 2

    **KeePass Password Safe 2** 是一款专为个人和企业设计的强大且安全的密码管理软件,它在CTF(Capture The Flag)竞赛中虽然不那么常见,但在某些特定题目中却能发挥关键作用。这款工具的核心功能在于帮助用户安全...

    STM32库文件相关

    2. core_cm3.h 实现内核的寄存器映射,NVIC,SYSTICK等 3. stm32f1xx.h 存放外设初始化结构体,及初始化函数声明 4. stm32f1xx.c 存放外设库函数 5. core.cm3 / msic 存放ARM的CM3内核库函数包含NVIC等,新库...

Global site tag (gtag.js) - Google Analytics