整理了几个以前从网上记录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;
}
}
分享到:
相关推荐
在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间研究了下,下面这篇文章主要给大家介绍了关于Java中Unsafe类的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧
MSIC10.9.2.rar
非常全面的计算机资源管理分析器,以xml的数据格式产生报告
MSIC, source code for delphi
c#接收MSIC同步包
C语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言...
tbPlayMusic = (ToggleButton) findViewById(R.id.tb_msic); mediaPlayer = MediaPlayer.create(this, R.raw.nishiwodeyan);//指定了播放源 tbPlayMusic.setOnCheckedChangeListener(new CompoundButton....
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
2. core_cm3.h 实现内核的寄存器映射,NVIC,SYSTICK等 3. stm32f1xx.h 存放外设初始化结构体,及初始化函数声明 4. stm32f1xx.c 存放外设库函数 5. core.cm3 / msic 存放ARM的CM3内核库函数包含NVIC等,新库...
Microsoft Direct Msic 8.1支持;支持DLS 1.0,2.0;内置全新的Diamond FreeCtrl(TM) 1.5工具(包括Info tools 和Api controller),和Diamond Winamp MP3-EAX插件,提供了超越Diamond 7100VXD版的的功能!
与其他传感器相比,使用80μmSiC处理的YSZ基板的传感器在850°C时对NO2的信号最大,其对100 ppm NO2的响应比基于传感器的传感器高约1.08、1.21和1.5倍在分别用60μmSiC,40μmSiC和光滑的YSZ衬底喷砂处理过的YSZ...
delphi Aes 加密控件 MSICS_Trial 硬件信息控件 获取本地硬件序列号的2个插件。
mini241o 按键的3种驱动 字符设备 混杂设备 platform驱动
BASE64Encode 编码,在andorid没有这个编码,这里面有打成jar包,可以导进去。用源代码打包的。手懒不愿意自己弄得话,可以下载导进去。里面附带着源代码,也可将源代码开进去直接使用,希望能帮助大家。
通过设计一种可配置SIC计数器和种子生成电路,证明了该方法中任意的2个 MSIC图形在任何情况下都是相异的。以国际基准测试电路ISCAS’89为对象,在nangate 45 nm工艺上的仿真实验表明,基于该方法的测试生成电路的...
ctf中不太常用的一个工具 但有的题会用到 KeePass Password Safe是一款优秀的密码管理工具,实际上可能还不仅仅是密码管理工具,重要的文件也可以保存在这款软件中
甲骨论-08-Undo表空间管理 本章详细介绍了undo表空间的工作原理以及与undo相关的数据字典