一种使用unsafe类修改变量值的方式_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 一种使用unsafe类修改变量值的方式

一种使用unsafe类修改变量值的方式

 2013/12/11 16:09:08  liuInsect  程序员俱乐部  我要评论(0)
  • 摘要:本例子演示了另外一种修改变量值的方式,希望可以让读者从另外一个角度看待变量,欢迎大家讨论。请看例子packageconcurrentTest;importjava.lang.reflect.Field;importsun.misc.Unsafe;/***jdk提供了一个unsafe类来直接通过内存地址来操作变量*该例子演示了另外一种变换变量值的方式*@PackageconcurrentTest*@authorliukunyang*@date2013-12-11下午02:36
  • 标签:使用 方式

例子演示了另外一种修改变量值的方式,希望可以让读者从另外一个角度看待变量,欢迎大家讨论。

请看例子

?

class="java" name="code">package concurrentTest;

import java.lang.reflect.Field;

import sun.misc.Unsafe;

/**
 * jdk 提供了一个unsafe类来直接通过 内存地址来操作变量
 * 该例子演示了 另外一种变换 变量值的方式
* @Package concurrentTest 
* @author liukunyang
* @date 2013-12-11 下午02:36:23 
* @version V1.0
 */
public class UnsafeTest {

	private int i;
	
	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}
	/**
	 * @author liukunyang
	 * @date 2013-3-20	
	 * @param args
	 * @throws NoSuchFieldException 
	 * @throws SecurityException 
	 */
	public static void main(String[] args) throws SecurityException, NoSuchFieldException {
		// TODO Auto-generated method stub
		
		UnsafeTest ust = new UnsafeTest();
		/**
		 * 抛unsafe security异常,所以通过反射调用
		 * unsafe直接访问内存,所以不应在不受信用的类中访问
		 *     public static Unsafe getUnsafe() {
         *         Class cc = sun.reflect.Reflection.getCallerClass(2);
         *			  if (cc.getClassLoader() != null)
		 *             throw new SecurityException("Unsafe");
         *         return theUnsafe;
         *     }
		 * 
		 */
//		Unsafe unsafe = Unsafe.getUnsafe(); 
		
		Unsafe unsafe =null; 
	    try{ 
		    Class<?> clazz = Unsafe.class; 
	        Field f; 
	
			f = clazz.getDeclaredField("theUnsafe"); 
			f.setAccessible(true); 
	        unsafe = (Unsafe) f.get(clazz); 
	    } catch (IllegalAccessException e) { 
            e.printStackTrace(); 
        }catch (SecurityException e) { 
        	e.printStackTrace(); 
		} catch (NoSuchFieldException e) { 
			e.printStackTrace(); 
		} 
		
		Long offfset = unsafe.objectFieldOffset(UnsafeTest.class.getDeclaredField("i"));
		unsafe.putInt(ust, offfset, 2);//修改掉i变量的值。
		System.out.println( ust.getI() );
	}

}

?

发表评论
用户名: 匿名