File tree Expand file tree Collapse file tree 1 file changed +43
-0
lines changed
Expand file tree Collapse file tree 1 file changed +43
-0
lines changed Original file line number Diff line number Diff line change @@ -304,6 +304,49 @@ public boolean validate(long stamp) {
304304
305305#### 介绍
306306
307+ ** 例子**
308+
309+ ``` java
310+ import sun.misc.Unsafe ;
311+ import java.lang.reflect.Field ;
312+
313+ public class Main {
314+
315+ private int value;
316+
317+ public static void main (String [] args ) throws Exception {
318+ Unsafe unsafe = reflectGetUnsafe();
319+ assert unsafe != null ;
320+ long offset = unsafe. objectFieldOffset(Main . class. getDeclaredField(" value" ));
321+ Main main = new Main ();
322+ System . out. println(" value before putInt: " + main. value);
323+ unsafe. putInt(main, offset, 42 );
324+ System . out. println(" value after putInt: " + main. value);
325+ System . out. println(" value after putInt: " + unsafe. getInt(main, offset));
326+ }
327+
328+ private static Unsafe reflectGetUnsafe () {
329+ try {
330+ Field field = Unsafe . class. getDeclaredField(" theUnsafe" );
331+ field. setAccessible(true );
332+ return (Unsafe ) field. get(null );
333+ } catch (Exception e) {
334+ e. printStackTrace();
335+ return null ;
336+ }
337+ }
338+
339+ }
340+ ```
341+
342+ 输出结果:
343+
344+ ```
345+ value before putInt: 0
346+ value after putInt: 42
347+ value after putInt: 42
348+ ```
349+
307350** 对象属性**
308351
309352对象成员属性的内存偏移量获取,以及字段属性值的修改,在上面的例子中我们已经测试过了。除了前面的` putInt ` 、` getInt ` 方法外,Unsafe 提供了全部 8 种基础数据类型以及` Object ` 的` put ` 和` get ` 方法,并且所有的` put ` 方法都可以越过访问权限,直接修改内存中的数据。阅读 openJDK 源码中的注释发现,基础数据类型和` Object ` 的读写稍有不同,基础数据类型是直接操作的属性值(` value ` ),而` Object ` 的操作则是基于引用值(` reference value ` )。下面是` Object ` 的读写方法:
You can’t perform that action at this time.
0 commit comments