Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); Unsafe unsafe = (Unsafe) theUnsafe.get(Unsafe.class); //theUnsafe.get(Unsafe.class.newInstance()) // exception: Class loader.UnsafeTest can not access a member of class sun.misc.Unsafe with modifiers "private" // private Unsafe() { // }
People user =(People) unsafe.allocateInstance(People.class);//实例化但未经过new Constructor();
//类变量修改 Field staticNumField = People.class.getDeclaredField("num"); staticNumField.setAccessible(true); long staticNumFieldOffset=unsafe.staticFieldOffset(staticNumField); unsafe.putInt(People.class,staticNumFieldOffset,11); System.out.println(staticNumField.get(user));
//实例变量修改 Field field = People.class.getDeclaredField("age"); field.setAccessible(true); long ageOffset = unsafe.objectFieldOffset(field); unsafe.putInt(user, ageOffset, 22); System.out.println(field.get(user));
Unsafe unsafe = getUnsafe(); final String s = "abc"; String s1 = "abc";
System.out.println(s==s1);//true //获取s的实例变量value Field valueInString = String.class.getDeclaredField("value"); //获取value的变量偏移值 long offset = unsafe.objectFieldOffset(valueInString); //value本身是一个char[],要修改它元素的值,仍要获取baseOffset和indexScale long base = unsafe.arrayBaseOffset(char[].class); long scale = unsafe.arrayIndexScale(char[].class);
近期评论