setAccessible(true)用法及意义

setAccessible(true)用法及意义实际开发中 setAccessibl 具体的用处主要有两处 作用于方法上 method setAccessibl true publicstatic throwsExcept Useru newUser Classclazz u getClass Methodm clazz getDeclaredM

实际开发中,setAccessible具体的用处主要有两处:

作用于方法上,method.setAccessible(true);

public static void test02() throws Exception{ User u = new User(); Class clazz = u.getClass(); Method m = clazz.getDeclaredMethod("getUname", null); m.setAccessible(true); m.invoke(u, null); }

作用于属性上,field.setAccessible(true);

if (field.isAnnotationPresent(TestIdSign.class)){ try { field.setAccessible(true); field.set(object,testId); } catch (IllegalAccessException e) { throw new RuntimeException("set testID illegalAccessException",e); } }

将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查;实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 ;

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

如下例子:参考(http://huoyanyanyi10.iteye.com/blog/)

package com.chenshuyi.test; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Method m = A.class.getDeclaredMethod("getName", new Class[] {}); System.out.println(m.isAccessible()); // getName是public的,猜猜输出是true还是false A a = new A(); a.setName("Mr Lee"); long start = System.currentTimeMillis(); for (int i = 0; i < ; i++) { m.invoke(a, new Object[] {}); } System.out.println("Simple :" + (System.currentTimeMillis() - start)); m.setAccessible(true); // 注意此处不同 long start1 = System.currentTimeMillis(); for (int i = 0; i < ; i++) { m.invoke(a, new Object[] {}); } System.out.println("setAccessible(true) :" + (System.currentTimeMillis() - start1)); } } class A { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }

使用了method.setAccessible(true)后 性能有了20倍的提升
Accessable属性是继承自AccessibleObject 类. 功能是启用或禁用安全检查

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223290.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:25
下一篇 2026年3月17日 下午2:25


相关推荐

  • html font 设置 字体_html font-weight

    html font 设置 字体_html font-weightCSS布局HTML小编今天和大家分享助如何在latex写粗体的希腊字母怎样用latex加黑数学公式中的小写希腊字母?像是\mathbf{\tau}\boldsymbol{\tau}\pmb{\tau}都使用过了,都不行。将以下几行代码保存成一个文件,如test_bold.tex,在winedt下运行,就会出带黑体小些希腊字母的高斯公式。\documentclass[journal]{IE…

    2022年10月13日
    4
  • 深度相机(TOF)的工作原理

    深度相机(TOF)的工作原理文章目录深度相机(TOF)的工作原理TOF由什么组成?一、TOF相机采用主动光探测,通常包括以下几个部分:二、TOF是如何测距的呢?三、TOF会受什么影响?四、那TOF相机最后输出的是什么呢?深度相机(TOF)的工作原理TOF(Timeofflight)直译为“飞行时间”。其测距原理是通过给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉冲的飞行(往返)时间来得到目标物距离。这种技术跟3D激光传感器原理基本类似,只不过3D激光传感器是逐点扫描,而TOF相机则是同时得到整幅图像的深度(

    2022年5月25日
    51
  • MyBatis快速入门第八讲——MyBatis逆向工程自动生成代码

    MyBatis快速入门第八讲——MyBatis逆向工程自动生成代码MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码什么是逆向工程MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。使用逆向工程

    2022年6月19日
    43
  • Java学习之AWT GUI编程

    Java学习之AWT GUI编程

    2020年11月20日
    174
  • android 浏览器控件[通俗易懂]

    android 浏览器控件[通俗易懂]在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。 什么是webkit WebKit是MacOSXv10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。同时,WebKit也是MacOSX的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且

    2022年5月15日
    45
  • 设置matlab保存的图片没有白边,matlab如何保存figure中去掉白边的图片「建议收藏」

    设置matlab保存的图片没有白边,matlab如何保存figure中去掉白边的图片「建议收藏」输出图片成可直接调入的灰度图,设置输出图片空白边距,以及调整图片大小,纵横比。一、先显示图片,imshow。如果是plot,或者newplot,直接看“三”。imshow(strain_image,’border’,’tight’,’initialmagnification’,’fit’);%’border’,’tight’的组合功能意思是去掉图像周边空白%’InitialMagnificatio…

    2025年8月26日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号