我使用了一些注释动态设置在类字段的值。 因为我想做到这一点,无论它是公共的,保护的,还是私人的,我是一个呼叫setAccessible(true)每次Field对象上调用之前set()方法。 我的问题是什么样的影响呢的setAccessible()调用已经在球场上本身?

更具体地讲,说这是一个私人领域,这组代码调用setAccessible(true) 。 如果代码中的其他地方是那么地检索通过反射同场,将现场已经可以访问? 抑或是getDeclaredFields()和getDeclaredField()方法每次返回Field对象的新实例?

我想提出这个问题的另一种方式是,如果我叫setAccessible(true) ,是多么重要的是它设置回原始值,我做了之后?

Answer 1:

随着setAccessible()更改的行为AccessibleObject ,即Field实例,而不是类的实际领域。 这里的文档 (节选):

的值true表明,当它被使用的反射对象应该抑制为Java语言访问控制检查

和一个可运行的例子:

public class FieldAccessible {

public static class MyClass {

private String theField;

}

public static void main(String[] args) throws Exception {

MyClass myClass = new MyClass();

Field field1 = myClass.getClass().getDeclaredField("theField");

field1.setAccessible(true);

System.out.println(field1.get(myClass)); // no exception

Field field2 = myClass.getClass().getDeclaredField("theField");

System.out.println(field2.get(myClass)); // IllegalAccessException

}

}

Answer 2:

该getDeclaredField方法每次都返回一个新的对象,正是因为这个对象具有可变的accessible标志。 所以,没有必要重新设置标志。 你可以找到的全部细节这个博客帖子 。

Answer 3:

正如其他海报指出, setAccessible只适用于你的那个实例java.lang.reflect.Field ,所以设置无障碍设施恢复到原来的状态是没有必要的。

然而...

如果您想您的通话field.setAccessible(true)是持久性的,你需要使用下面的方法java.lang.Class和java.lang.reflect.Field 。 面向公众的方式发送给您的副本 Field实例,因此它“忘记”以后每次做类似class.getField(name)

import java.lang.reflect.*;

import sun.reflect.FieldAccessor;

public class Reflect {

private static Method privateGetDeclaredFields;

private static Method getFieldAccessor;

public static Field[] fields(Class> clazz) throws Exception {

return (Field[]) privateGetDeclaredFields.invoke(clazz, false);

}

public static T get(Object instance, Field field) throws Exception {

return ((FieldAccessor) getFieldAccessor.invoke(field, instance)).get(instance);

}

public static void set(Object instance, Field field, Object value) throws Exception {

((FieldAccessor) getFieldAccessor.invoke(field, instance)).set(instance, value);

}

static {

try {

// These are used to access the direct Field instances instead of the copies you normally get through #getDeclaredFields.

privateGetDeclaredFields = Class.class.getDeclaredMethod("privateGetDeclaredFields", boolean.class);

privateGetDeclaredFields.setAccessible(true);

getFieldAccessor = Field.class.getDeclaredMethod("getFieldAccessor", Object.class);

getFieldAccessor.setAccessible(true);

} catch (Exception e) {

// Should only occur if the internals change.

e.printStackTrace();

}

}

}

Answer 4:

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class PrivateVariableAcc {

public static void main(String[] args) throws Exception {

PrivateVarTest myClass = new PrivateVarTest();

Field field1 = myClass.getClass().getDeclaredField("a");

field1.setAccessible(true);

System.out.println("This is access the private field-"

+ field1.get(myClass));

Method mm = myClass.getClass().getDeclaredMethod("getA");

mm.setAccessible(true);

System.out.println("This is calling the private method-"

+ mm.invoke(myClass, null));

}

}

文章来源: Java reflection - impact of setAccessible(true)

java反射 setAccess,Java反射 - setAccessible的影响(真)Java反射 - setAccessib相关推荐

  1. java 获取所有带指定注解的类名_SXT DAY023 反射和注解

    1. 反射机制介绍_Class对象获取 反射机制是 Java 的动态性之一 动态语言:在程序运行时,可以改变程序的结构或变量的 类型. 反射机制的常见作用 动态的加载类.动态的获取类的信息(属性,方法 ...

  2. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  3. Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?

    ava Java 基础这部分一些简单的问题就直接没有放上来. 需要资料的朋友麻烦一键三连之后点此免费获取! 基础: Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)? 谈谈对 ...

  4. java 反射类 spring_学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  5. java 反射机制 视频_【视频笔记】Java反射机制笔记

    Java 语言的反射机制 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法.对于任意一个对象,可以调用它的任意一个方法. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

  6. java后端技术路线_Java后端精选技术:Java的反射机制

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. ...

  7. java 里面怎么截取倒数第几个字_Java反射是什么

    前言 Java的反射特性是一项非常强大和有用的功能,它使得我们可以轻松的在运行时观察到类实例的内部状态,并且可以动态的操作实例,从而为Java语言提供更多更灵活的想象空间.随便举几个例子:使用反射可以 ...

  8. 什么叫做类的类?如何获取私有的方法?Java反射机制太强大了,详解Java反射机制【Java养成】

    Java学习打卡:第二十二天 内容导航 Java学习打卡:第二十二天 内容管理 Java反射机制 问题引入---数据库介绍 Java反射的介绍 class的使用 由字符串产生类和对象 获取一个类的所有 ...

  9. Java 8 自动装箱拆箱效率影响测试

    Java 8 自动装箱拆箱效率影响测试 测试完毕之后的结论:   1. 装箱发生 232−12^{32-1}232−1 次的时候影响时间大概为10秒   2. 拆箱发生 232−12^{32-1}23 ...

  10. 超有霸气的,有影响力的Java/C++/ASP.NET面试题

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二 ...

最新文章

  1. 孙正义的软银愿景宫斗内幕:印度裔高管争宠,黑公关手段,设局桃色仙人跳...
  2. ASP.NET2.0_执行页面发送的强类型方法与弱类型方法
  3. 给jdk写注释系列之jdk1.6容器(1):ArrayList源码解析
  4. bootstrap-进度条
  5. [bzoj1050 HAOI2006] 旅行comf (kruskal)
  6. 列出一个目录中所有文件及大小
  7. arcgispython空间插值_基于python的空间距离权重计算——arcgis中的arcpy
  8. php css 编译,LAMP环境搭建之php安装
  9. SQL 2012安装、配置路径
  10. (转)曹锋、宋天玮:区块链技术在证券市场中的应用探索
  11. 【Vue: 使用pdf.js顯示PDF Viewer】
  12. u盘写保护+计算机管理,取消u盘写保护的操作方法-电脑自学网
  13. 高校毕业生就业信息管理系统的设计与实现(Spring + Spring MVC +Hibernate)
  14. 写在博士旅程之前|博士第一年|博士第三年|博士第四年
  15. php 队列管理器,Horizon 队列管理工具
  16. 利用HttpWebRequest自动抓取51la统计数据
  17. HTML5+CSS3小实例:不偷看密码的超萌猫头鹰登录界面
  18. Win10使用Ctrl+Space切换输入法
  19. Nginx 性能优化 Gzip 压缩配置
  20. 人脸识别损失函数梳理与分析/相关方法整理

热门文章

  1. STM32系列单片机SPI速度研究(flash读取写入速度提高,液晶显示屏刷新率提高)
  2. ssm商城系统html模块,jsp+ssm+mysql实现的【在线商城系统】毕设思路指导及模板文档...
  3. 万月薪的英语人是如何练成的!!!讲一口漂亮流利的英语[转]
  4. 工作总结汇报该怎么写,才能让上司满意
  5. 三星手机显示app无网络连接到服务器,三星应用商店发生错误?三星应用商店无法连接网络怎么办?[图]...
  6. 微软计算器的用法 英文单词
  7. Java如何自定义异常?
  8. 在link.c中已经include了头文件了,为什么使用ld还无法识别mian和printf?
  9. 最小yaffs2文件系统移植(目标板TQ2440)
  10. 微信小程序模板消息限制,实现无限制主动推送