`
huoyanyanyi10
  • 浏览: 52475 次
  • 性别: Icon_minigender_1
  • 来自: 赤峰
社区版块
存档分类
最新评论

提高java反射速度的方法method.setAccessible(true)

    博客分类:
  • java
阅读更多
提高java反射速度的方法method.setAccessible(true) 2011.12.19阅读(3)下一篇:开机后,桌面上没... |返回日志列表 赞赞赞赞转载分享评论复制地址编辑

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)的方式关闭安全检查就可以达到提升反射速度的目的


友情链接:珀莱雅  欧诗漫  专卖 http://store.taobao.com/shop/view_shop.htm?mytmenu=mdianpu&utkn=g,2djlrizuga4a1324992712104&user_number_id=372143050 
分享到:
评论
1 楼 夜色蓝 2014-03-13  
楼主讲得很具体,还开淘宝店的说。

相关推荐

    java反射机制学习笔记

    GPRS网络开关

    iConnectivityManagerField.setAccessible(true); final Object iConnectivityManager = iConnectivityManagerField.get(conman); final Class iConnectivityManagerClass = Class.forName(iConnectivityManager....

    JxBrower6.21破解版

    e.setAccessible(true); Field f = ba.class.getDeclaredField("f"); f.setAccessible(true); Field modifersField = Field.class.getDeclaredField("modifiers"); modifersField.setAccessible(true); ...

    Java 高级特性.doc

    因为程序里面有个静态方法,如果导入import static java.lang.Integer.parseInt;这样的程序就可以运行了。 2.可变参数与for循环增强 这个是一般的用法: public static void loop(String[] args){ for(int i=0;i...

    day021-反射和注解笔记和代码.rar

    method2.setAccessible(true);//破坏普通方法Method封装 //破坏封装后就可以执行了 Object invoke2 = method2.invoke(newInstance);//没有形参就不用写 System.out.println(invoke2); ...

    setAccessible()方法是否破坏了Java的访问规则

    一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种...

    permit-reflect:允许对Java 11进行反射访问

    Permit.setAccessible启用对Field或Method访问,而无需考虑模块 Permit.godMode将所有模块中的所有软件包打开到所有模块 Permit.main在上帝模式下运行指定类的main方法。 这应该允许许多Java 8程序与Java的更高版本...

    EasyKeyBoardView-master.rar

    method.setAccessible(true); method.invoke(editText, false); } catch (Exception e) { e.printStackTrace(); } } 1)计算输入的edittext与键盘高度差,再对rootView进行scrollBy滚动(顶布局)。 rootView....

    APPFORPHONEAAA

    field.setAccessible(true); infos.put(field.getName(), field.get(null).toString()); Log.i(TAG, field.getName() + " : " + field.get(null)); } catch (Exception e) { Log.e(TAG, "an ...

    eclipse安卓开发必备工具

    Constructor、Field、Method都是继承于AccessibleObject,对应实例调用 setAccessible(true)就关闭该开关 如上面的例子,在代码 cts[i].newInstance(null);行前调用上述方法: cts[i].setAccessible(true); 这样就...

    你不知道的JAVA高级应用

    2.反射,暴力反射,和静态做斗争,暴力反射,setAccessible 无论公有私有都可以用来访问 3.动态代理 在调用这个目标方法前,后,2头,异常处都可以动态的加上自己需要逻辑判断,而且根据反射来动态的替换实现类,大大提升了...

    xmljava系统源码-MyTabLayout:修改系统的TabLayout来改变Indicator(下划线)的样式

    使用网上普遍的方法,反射TabLayout 1、写个工具类 封装: public class TabLayoutUtils { public static void setIndicator(TabLayout tabs, int leftDip, int rightDip, int bottomDip) { Class&lt;?&gt; ...

    Json解析ParsreTools.zip

    field.setAccessible(true); field.set(t, object); } } catch (Exception e) { e.printStackTrace(); } return t; } public static &lt;T&gt; List&lt;T&gt; pasrsJsonStrMultT(String jsonString, ...

    Action Bar初识案例

    = null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(mconfig, false); } } catch (Exception ex) { }2、Action Bar自定义样式之前Action Bar是不兼容3.0以下的,有开源的actionbarsherlock可以...

    Android代码-fest-reflect

    Reflect provides an intuitive, compact and type-safe fluent API that makes Java reflection tremendously easy to use: no more casting, checked exceptions, PriviledgedActions or calls to setAccessible....

    java实现非法访问异常示例

    创建ExceptionTest类,在该类的main()方法中,使用反射获得String类的所有域,不要使用setAccessible方法修改这些域的可见性,然后通过反射获得私有域中与”hash”相匹配的int值,并使用try-catch语句块捕获非法访问...

    web课作业清单1

    Team23选1·普通:编程实现利用反射获取类信息· 中等:利用setAccessible方法禁止访问类中私有属性和方法(获取不到私有属性和方法)· 地狱:利用

Global site tag (gtag.js) - Google Analytics