`
buaixianchen
  • 浏览: 24098 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Reflection 操作 Unsafe

阅读更多

获取Reflection的2种方式,详细内容参见代码(Marked here.2011/11/12 晚)

package com.myjdk.helper;

import java.lang.reflect.Field;
import sun.misc.Unsafe;
import junit.framework.TestCase;

public class TestUnsafeSupport extends TestCase {
	
	private static Unsafe unsafe;
	private static Person person;
	
	protected void setUp() throws Exception {
		Field field = null;
		try {
			field = Unsafe.class.getDeclaredField("theUnsafe");
			field.setAccessible(true);
			unsafe = (Unsafe) field.get(null);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		person = new Person();
	}
	
	/**
	 * 一般Reflection的操作java.lang.reflect.*
	 */
	public void testOrdinaryReflection() {
		try {
			Class<?> personClazz = Person.class;
			Field __ageField = personClazz.getDeclaredField("age");
			assertEquals(0, __ageField.getInt(person));
			
			__ageField.set(person, 5);
			assertEquals(5, __ageField.getInt(person));
		} catch (Exception ex) {
			fail(ex.getLocalizedMessage());
		}		
	}
	
	/**
	 * 测试sun.mic.Unsafe获取类Reflection以及初始化、修改对象状态等操作
	 * 
	 * 
	 */
	public void testUnsafeReflection() {
		try {
			// 获取field在class定义中的位移位置
			long ageOffset = unsafe.objectFieldOffset(Person.class.getDeclaredField("age"));
			
			// getInt获取初始值
			// 需要查看一下unsafe.getInt(long),确认这个long参数具体代表什么含义
			// 经测试offset为参数的话,JVM异常
			assertEquals(0, unsafe.getInt(person, ageOffset));
			
			// cas 
			// public native boolean compareAndSwapInt(Object obj, long offset, int expect, int update);  
			unsafe.compareAndSwapInt(person, ageOffset, 0, 25);
			unsafe.compareAndSwapInt(person, ageOffset, 12, 36);
			
			assertEquals(25, unsafe.getInt(person, ageOffset));
			
			unsafe.putInt(person, ageOffset, 0);
			
			assertEquals(0, unsafe.getInt(person, ageOffset));
			
			// unsafe.putIntVolatile();
		} catch (Exception ex) {
			fail(ex.getLocalizedMessage());
		}		
	}
}

class Person {
	String name;
	int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

 

分享到:
评论

相关推荐

    .NET面试题A(问题与答案)

    7. 内存操作:C#支持 unsafe 模式下的指针操作,但不鼓励直接操作内存,而是使用垃圾回收机制管理内存。 8. Error与Exception:Error表示系统级错误,难以恢复;Exception是应用程序中可捕获的异常,表示程序运行时...

    jdk sun 开头的源码

    `sun.misc.Unsafe`类是一个特殊的存在,它提供了对Java内存模型的直接访问,尽管不建议在普通应用中使用,但在一些高性能或底层操作的场景下可能会用到。 5. **网络编程**:`sun.net`包包含了网络协议的实现,如TCP...

    C# 2005 NET3.0高级编程(第5版)

    在.NET环境中,垃圾回收机制自动管理内存,但C#也支持 unsafe 关键字,允许开发者使用指针直接操作内存。这在处理高性能计算、底层系统交互或调用非托管代码时非常有用。本章将介绍.NET内存模型、对象生命周期、...

    Address-Dumper

    尽管.NET框架并不直接支持获取对象的内存地址,但通过一些技术手段,如反射(Reflection)和 unsafe 代码块,我们可以间接实现这个目标。 1. 反射:C#的反射机制允许我们在运行时检查类、接口、方法等类型信息,...

    reflect:一个Java库,可实现简洁的反射和不受限制的访问

    Reflection是一个Java反射库,它试图克服对反射的限制,并通过使用Unsafe使其简洁,同时实现更高的性能。 尽管反射不会触发非法访问记录器,并提供了避免这种情况的工具,但是仍然可以禁用该记录器。 安全管理器也...

    jdk1.8源码包含sun

    例如,`sun.misc.Unsafe`类提供了许多非安全但高效的原生操作,如内存分配、原子操作等。尽管不推荐直接使用,但在高性能或低级别编程场景中,这些功能有时是必需的。 3. **编译器和JIT(Just-In-Time)优化**: ...

    PE文件解析(C#)

    此外,还可以利用unsafe关键字和指针操作,直接对二进制数据进行访问,但这种方式需要谨慎处理,防止内存安全问题。 .NET框架中的元数据是与PE文件解析密切相关的概念。在C#编译后,源代码会被转换为IL...

    my-java-explore:对jdk的一些探索

    在“my-java-explore”项目中,作者深入探讨了JDK的多个重要方面,包括Lambda表达式、反射(Reflection)、服务提供者接口(SPI)、JDK8的新特性、Unsafe类以及Java代理(JavaAgent)。让我们逐一深入了解这些关键知识点。...

    [Csharp高级编程(第6版)]12章13章14章

    通过使用`unsafe`关键字,可以在代码中声明不安全的上下文,并在此上下文中使用指针进行低级别的内存操作。 #### 3. 不安全代码 使用指针编写的代码被称为不安全代码。虽然它们提供了更灵活的内存访问能力,但同时...

    33条C#、.Net经典面试题目及答案

    - C#中可以使用`unsafe`上下文进行内存操作,但通常不推荐,因为.NET框架提供了垃圾回收机制。 8. **Error与Exception的区别**: - Error表示系统级错误,通常难以恢复;Exception是应用程序运行时出现的问题,...

    RazorSharp:用于CLR和内存的低级实用程序和工具

    目标RazorSharp旨在提供与ClrMD , WinDbg SOS和Reflection相似的功能,但以更详细的方式提供,同时还公开了更多基础元数据和CLR功能。 RazorSharp还允许操纵CLR和使用托管对象进行低级操作。 此外, RazorSharp不...

    Novus:用于CLR和内存的低级实用程序和工具

    Novus旨在提供与ClrMD , WinDbg SOS和Reflection相似的功能,但以更详细的方式提供,同时还公开了更多基础元数据和CLR功能。 Novus还允许使用受管理对象来操纵CLR和低级操作。 此外, Novus不需要将调试器附加到...

    java-handles-kata:Java反射和不安全的替代方法-MethodHandle和VarHandle API-修复代码卡塔中损坏的测试

    VarHandle API是在Java 9中添加的,它是对基本类型和对象字段进行原子操作和内存语义操作的高级接口。VarHandle不仅提供了原子性,还支持volatile语义,这使得它在多线程环境中特别有用。通过VarHandle,开发者可以...

    Java解惑(谜题)CHM中英文双版本

    谜题25:无情的增量操作 谜题26:在循环中 谜题27:变幻莫测的i值 谜题28:循环者 谜题29:循环者的新娘 谜题30:循环者的爱子 谜题31:循环者的鬼魂 谜题32:循环者的诅咒 谜题33:循环者遇到了狼人 谜题...

    图文详解go语言反射实现原理

    在Go语言中,反射(reflection)是一个强大的工具,允许程序在运行时检查并操作其自身的结构和数据。本文将深入探讨Go语言反射的实现原理,尤其是与`interface`和`unsafe.Pointer`的关系。 首先,我们需要了解`...

    Asm解释器

    在C#环境中,这可能涉及使用 unsafe 代码块和指针操作,或者模拟堆栈和数据段。 4. **寄存器模拟**:汇编语言中的运算通常涉及到寄存器,因此解释器需要模拟这些寄存器的逻辑,保持它们的状态并进行相应的计算。 5...

    .net基础收集汇总

    3. C#编程中,可以使用unsafe关键字进行指针操作,这允许直接访问内存。 4. 结构(struct)与类(class)的区别是C#语言中的基础知识。 结构是值类型,而类是引用类型。结构不可以声明无参数的构造函数,而类可以。类...

    提高C#编程水平的50个要点

    `as` 操作符是一种安全的类型转换方式,它不会抛出异常。如果转换失败,则返回null(对于值类型则返回默认值)。这有助于避免运行时错误。 ```csharp object obj = new MyClass(); MyClass mc = obj as MyClass; ```...

Global site tag (gtag.js) - Google Analytics