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

快速访问Object的Field

    博客分类:
  • java
阅读更多

     在写框架时经常需要访问或修改某个Object的Field值,如这个Object遵循Bean协议,大家熟知的方法是通过反射调用get/set方法,或通过java.lang.reflect.Field类的get或set方法操作。尽管可以将Method和Field进行缓存,但这两种方法效率都不是很高。能有效提高性能的方法之一是使用sun.misc.Unsafe该类功能很强大,涉及到类加载机制,尽管该类提供了工厂方法getUnsafe来构造该类的实例,但涉及到安全访问问题,会抛出java.lang.SecurityException。该类位于rt.jar下,JVM 加载rt.jar时已经加载了该类,并且初始化过,可通过反射机制变通。

 

// 获得Unsafe中已声明的实例Field
Field field = Unsafe.class.getDeclaredField("theUnsafe");
//取消反射机制对语言访问的检查
field.setAccessible(true);
// 获取静态属性。因theUnsafe是static Field,故可传递null值
Unsafe unsafe = (Unsafe) field.get(null);
 

 

    Unsafe类中定义了几类方法:

 

  • 获取Field offset方法。使用调用get*和put*方法
  • get*/put*方法
  • compareAndSwap*方法:利用cpu的CAS算法,解决在并发情况下对变量进行原子操作
  • 其他:copyMemory、defineClass、allocateMemory等方法。
    简单性能测试,使用Unsafe会比Field调用有近10位的性能提高。

    关于CPU的CAS介绍可参考:CAS指令与MESI缓存一致性协议

 

分享到:
评论

相关推荐

    获取 STRUTS2 FIELDERROR

    具体来说,可以使用 `request.getAttribute()` 方法来访问由Struts2框架存储的错误信息。这种方法的好处在于它可以提供更大的灵活性,允许开发者根据自己的需求来定制错误信息的显示方式。 下面是一个示例代码片段...

    Java利用反射获取object的属性和值代码示例

    "Java利用反射获取object的属性和值代码示例" Java中的反射机制可以让我们在程序运行时动态地获取和修改对象的属性和值,这个技术非常有用,尤其是在一些框架和库的实现中。在这篇文章中,我们将通过一个实用的例子...

    Oracle Json常用方法封装

    8. **JSON索引**:如果需要快速访问JSON数据,可以创建`JSON_INDEXES`,提高查询性能。 9. **序列化/反序列化**:`to_char`方法将JSON对象转换为字符串,而`from_char`则反向操作,如`serialize_json`和`...

    就几个反射的例子

    Object fieldValue = field.get(obj); ``` 同样,我们可以通过 `getMethods()` 和 `getDeclaredMethods()` 获取类的方法,包括继承的方法和私有方法。调用方法的语法类似: ```java Method method = clazz....

    映射ResultSet结果

    private Object convertValue(Object value, Class<?> fieldType) { // 这里进行类型转换,例如:将String转为Integer等 if (value == null) return null; if (fieldType.equals(Integer.class)) return Integer...

    java实体对象与Map之间的转换工具类代码实例

    for (Field field : object.getClass().getDeclaredFields()){ try { boolean flag = field.isAccessible(); field.setAccessible(true); Object o = field.get(object); map.put(field.getName(), o); field...

    远程SQL SERVER数据库的访问策略.pdf

    本文主要探讨四种访问远程SQL SERVER数据库的方法,分别是:远程数据控件RDC(Remote Data Control)、远程数据对象RDO(Remote Data Object)、ActiveX数据对象ADO(ActiveX Data Object)以及ActiveX数据控件ADC...

    Java对象属性数据比较,返回变化数据

    Object oldValue = field.get(oldObj); Object newValue = field.get(newObj); // 比较属性值 if (!Objects.equals(oldValue, newValue)) { diffResults.put(field.getName(), new DiffResult(oldValue, ...

    Visual Studio 利用宏直接生成Get和Set属性

    Private Sub AddPropertyToClass(ByVal codeClass As CodeClass, ByVal fieldName As String, ByVal fieldType As Object) '...其他代码... Dim propertyName As String = fieldName If (propertyName.StartsWith...

    一致的数据访问技术——ADOOLE DB

    - **Field**:表示Recordset中的单个字段。 - **Property**:存储对象的状态信息。 这些对象通过COM接口进行交互,允许开发者轻松地操纵数据。 ##### OLE DB的结构与特点 **OLE DB**则是更接近底层的技术,它定义...

    delphi编译错误.txt

    它基于 Object Pascal 语言,并提供了丰富的库支持和高效的编译器。然而,在使用 Delphi 开发过程中,开发者可能会遇到各种编译错误。这些错误通常指向代码中存在的问题,并需要开发者进行修正。本文将详细介绍一...

    基于VueElementUI快速创建生成表单进行数据校验获取表单数据

    获取表单数据非常简单,只需在Vue实例上使用`this.$refs`访问到表单的引用,然后调用`validate`方法进行数据校验,最后通过`this.$refs.formRef.model`获取已填充的数据: ```js methods: { handleSubmit() { ...

    vb 发邮件

    首先,需要引用Microsoft Outlook x.x Object Library,然后创建Outlook.Application对象,通过该对象访问Outlook的其他组件,如MailItem对象,用于创建和发送邮件。 示例代码: ```vb Dim olApp As Outlook....

    Javascript中最常用的55个经典技巧

    这样可以实现输入框之间的快速切换,而无需使用Tab键。 ```javascript function handleEnter(field, event) { var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode; if ...

    <27>erlang record

    ETS是Erlang中的一种高效、内存中的数据存储,常用于快速数据访问和共享。 `ets_test.erl`文件可能包含了如下内容: 1. 记录定义:定义了一个或多个Record,例如`-record(test_record, {key, value}).`,这创建了一...

    delphi生成insert 语句

    1. **Delphi简介**:Delphi是一款基于Object Pascal编程语言的集成开发环境(IDE),由Embarcadero Technologies开发。它提供了可视化的组件库和高效能的编译器,使得开发者能够快速构建Windows和跨平台应用程序。 ...

    Cache_Session_Cookie_Application_Hidden的区别

    `Cache` 提供了一种在服务器端快速访问数据的方法。它通常用于缓存频繁访问但不经常改变的数据。 **特点:** - 存储在服务器端:数据存储在服务器内存中。 - 生命周期:根据设置的过期时间自动失效。 - 高性能:...

    Word文件在Oracle中存取技术的设计与实现.pdf

    在IT行业中,数据库管理和文件存储是一项关键任务,尤其是在企业级应用中。本文主要探讨的是如何在...在实际项目开发中,这样的技术方案对于需要长期存储和快速访问复杂文档的企业级应用来说,具有重要的参考价值。

Global site tag (gtag.js) - Google Analytics