提高Java反射速度的方法以及对setAccessable的误解

mercyblitz 写道

ouchxp 写道

再就是在执行反射之前执行field.setAccessible(true); 也可以提高JDK反射效率

这样可以提高效率?这个方法仅仅设置访问标识,让不能访问的成员可以访问。

keating 写道

ouchxp 写道

再就是在执行反射之前执行field.setAccessible(true); 也可以提高JDK反射效率

正如楼上mercyblitz所说,如private变量... 

在此澄清一下对于setAccessable的误解 
先看一个例子 

Java代码  

  1. import java.lang.reflect.InvocationTargetException;  
  2. import java.lang.reflect.Method;  
  3.   
  4. public class Main {  
  5.     public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {  
  6.         Method m = A.class.getDeclaredMethod("getName", new Class[]{});  
  7.         System.out.println(m.isAccessible());  
  8.                 //getName是public的,猜猜输出是true还是false  
  9.           
  10.         A a = new A();  
  11.         a.setName("Mr Lee");  
  12.         long start = System.currentTimeMillis();  
  13.         for(int i=0;i<10000000;i++){  
  14.             m.invoke(a, new Object[]{});  
  15.         }  
  16.         System.out.println( "Simple              :" +(System.currentTimeMillis() - start));  
  17.           
  18.         m.setAccessible(true);//注意此处不同  
  19.         long start1 = System.currentTimeMillis();  
  20.         for(int i=0;i<10000000;i++){  
  21.             m.invoke(a, new Object[]{});  
  22.         }  
  23.         System.out.println("setAccessible(true) :"+( System.currentTimeMillis() - start1));  
  24.     }  
  25. }  
  26. class A{  
  27.     private String name;  
  28.     public String getName() {  
  29.         return name;  
  30.     }  
  31.     public void setName(String name) {  
  32.         this.name = name;  
  33.     }  
  34. }  

测试结果 

引用

false 
Simple              :4969 
setAccessible(true) :250 

明显 Accessible并不是标识方法能否访问的. public的方法 Accessible仍为false 
使用了method.setAccessible(true)后 性能有了20倍的提升 

Accessable属性是继承自AccessibleObject 类. 功能是启用或禁用安全检查 

JDK API中的解释 

引用

AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。 

在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。 

setAccessible 
public void setAccessible(boolean flag) 
                   throws SecurityException 
将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 

实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 

由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的 

时间: 2024-10-31 09:18:52

提高Java反射速度的方法以及对setAccessable的误解的相关文章

用innerhtml提高页面打开速度的方法

这篇文章介绍了用innerhtml提高页面打开速度的方法,有需要的朋友可以参考一下   查看源代码,可以发现,页首的登陆代码位置,只有一行 复制代码 代码如下: <div id="headtop"></div> 而flash幻灯的位置,也只有一行 复制代码 代码如下: <div id="index_slide"></div> 对于这种需要耗时的代码,最好是放在页面最后面加载,然后用innerhtml的方法加载到对应位置

动态载入js提高网页打开速度的方法_javascript技巧

一般来说如果一次性的载入所有需要的JavaScript代码,就会造成初始网页打开速度变慢,但是很多载入的代码又并不需要使用,这种无谓的性能浪费应该予以避免.如果要动态载入JavaScript代码,可以利用DOM模型在HTML文档中添加<script>结点,并将此结点的src属性(即 外联 Javascript文件)设置为需要动态载入的JavaScript代码. 下面就是完成这样功能的一个示例: (1).新建JsLoaderTest.html文件 <html xmlns="htt

禁止无用的程序运行来提高电脑开机速度的方法

在Windows中不必要的程序怎么禁止运行,在电脑使用一段时间后会出现一些不必要的程序,会影响我们电脑的运行速度,如果不需要的话禁止这些程序启动就可以了.可是要怎么禁止呢?下面三聯網就告诉大家具体的操作步骤. 在"开始"菜单中找到"运行",单击运行,会出来一个对话框.在出来的运行框里输入"msconfig",然后回车. 回车后,会出来一个对话框.名为"系统配置实用程序"找到"启动"选项卡. 把前面的勾去掉,

js中有效提高数据访问速度的方法

hasOwnProperty()仅检索实例不检索原型,in即检索实例,又检索原型 成员嵌套越深,访问速度越慢,只在必要的情况下使用对象成员. 如果在同一个函数中你要多次读取同一个对象属性,最好将它存入一个局部变量.以局部变量替代属性,避免多余的属性查找带来性能开销. 直接量和局部变量访问速度非常快,数组项和对象成员需要更长时间. 局部变量比域外变量快,因为它位于作用域链的第一个对象中.变量在作用域链中的位置越深,访问所需的时间就越长.全局变量总是最慢的,因为它们总是位于作用域链的最后一环. 避免

WinForm ListView 大数据提高加载速度的方法 虚拟模式加载

将VirtualMode 属性设置为 true 会将 ListView 置于虚拟模式.控件不再使用Collection.Add()这种方式来添加数据,取而代之的是使用RetrieveVirtualItem(Occurs when the ListView is in virtual mode and requires a ListViewItem.)和CacheVirtualItems两个事件,单独使用RetrieveVirtualItem也可以,CacheVirtualItems这个事件主要是

用innerhtml提高页面打开速度的方法_javascript技巧

查看源代码,可以发现,页首的登陆代码位置,只有一行 复制代码 代码如下: <div id="headtop"></div> 而flash幻灯的位置,也只有一行 复制代码 代码如下: <div id="index_slide"></div> 对于这种需要耗时的代码,最好是放在页面最后面加载,然后用innerhtml的方法加载到对应位置,达到加快页面打开速度的目的. 复制代码 代码如下: $("#headtop&

asp页面提高的访问速度的方法详解

技巧之一:提高使用Request集合的效率 访问一个ASP集合来提取一个值是费时的.占用计算资源的过程.因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多.因此,如果打算在页面中多次使用Request集合中的一个值,应该考虑将其存贮为一个局部变量.例如将代码写成下面的形式以加快脚本引擎处理速度: 复制代码 代码如下:strTitle=Request.Form("Title")strFirstName=Request.Form("FirstName"

提高U盘速度的方法

  目前主流的U盘已经8G.16G了,写入速度相对显得不足,下面提供了一个方法,称可以修改一下系统就大大提升Windows7下的U盘的性能. 这个办法跟我们所知的提升SATA硬盘性能的方法差不多,也就是开启"高级写入缓存(advanced write caching)",这种方法修改之后会增大作为写入缓存的系统内存容量,从而提升写入U盘的性能.不过它并不能让你更快的塞满一个8G大小的U盘,而是使得U盘对其他系统进程的响应速度更快,对于向U盘传输大量小文件或者是在优盘上运行某个应用程序的

iPhone输入速度慢怎么办?教你提高iPhone输入速度的方法

1.iphone自带的语音输入 如果使用语音输入那么网络不行肯定是非常的慢哦,所以我们可以必须在网络环境比较好的状态下实现. 1)打开siri 2) 然后 如下图我们点击话筒标志即可 3) 说完话我们点击完成,如图所示. 2.第三方的整句输入 1) 我们安装一个第三方的 整句输入等 2)使用26键(不用九宫哦) 如下图所示 3) 输和一些常用请词了,如wx 微信之类的. 好了,在这里输入慢还有一个就是手机本身慢了,这样可以尝试恢复出厂设置来解决手机运行慢的问题哦.