field.setAccessible(true) 简介
今天查看别人写的代码时,发现这样一句代码,顿时来了兴趣。
需要注意setAccessible 并不是在Field中的,而是在AccessibleObject中。
下面是AccessibleObject的解释:
意思是 AccessibleObject 类是 Field Method Constructor 类的基类。它提供反射对象绕过Java语言权限控制检查的权限。
当Fields Methods Constructors被用来set get 对象域,调用方法或者产生初始化对象实例的时候会践行权限检查(public default(package) protected private)。
将反射对象中的 accessible 标志位设置为 true,就意味着允许客户端拥有超级权限,比如Java对象序列化 或者 其他持久化机制等通常禁止的机制。
所以我们在accessible 标志位设置为true 的时候需要非常谨慎,这会带来一定的安全隐患。
**
* The AccessibleObject class is the base class for Field, Method and
* Constructor objects. It provides the ability to flag a reflected
* object as suppressing default Java language access control checks
* when it is used. The access checks--for public, default (package)
* access, protected, and private members--are performed when Fields,
* Methods or Constructors are used to set or get fields, to invoke
* methods, or to create and initialize new instances of classes,
* respectively.
*
* <p>Setting the {@code accessible} flag in a reflected object
* permits sophisticated applications with sufficient privilege, such
* as Java Object Serialization or other persistence mechanisms, to
* manipulate objects in a manner that would normally be prohibited.
*
* <p>By default, a reflected object is <em>not</em> accessible.
*
* @see Field
* @see Method
* @see Constructor
* @see ReflectPermission
*
* @since 1.2
*/
下面是 field.setAccessible(true); 方法的解释。
意思就是改方式是用来设置获取权限的。
如果 accessible 标志被设置为true,那么反射对象在使用的时候,不会去检查Java语言权限控制(private之类的);
如果设置为false,反射对象在使用的时候,会检查Java语言权限控制。
需要注意的是,设置为true会引起安全隐患。
/**
* Set the {@code accessible} flag for this object to
* the indicated boolean value. A value of {@code true} indicates that
* the reflected object should suppress Java language access
* checking when it is used. A value of {@code false} indicates
* that the reflected object should enforce Java language access checks.
*
* <p>First, if there is a security manager, its
* {@code checkPermission} method is called with a
* {@code ReflectPermission("suppressAccessChecks")} permission.
*
* <p>A {@code SecurityException} is raised if {@code flag} is
* {@code true} but accessibility of this object may not be changed
* (for example, if this element object is a {@link Constructor} object for
* the class {@link java.lang.Class}).
*
* <p>A {@code SecurityException} is raised if this object is a {@link
* java.lang.reflect.Constructor} object for the class
* {@code java.lang.Class}, and {@code flag} is true.
*
* @param flag the new value for the {@code accessible} flag
* @throws SecurityException if the request is denied.
* @see SecurityManager#checkPermission
* @see java.lang.RuntimePermission
*/
下面举例说明一下它的用处
1、首先新建一个bean类---Book
public class Book {
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public String getBookName() {
return BookName;
}
public void setBookName(String bookName) {
BookName = bookName;
}
private String bookId;
private String BookName;
}
2、创建工具类,使用反射来进行对象的set操作。
public class ReflectUtil {
private static Field getField(Object obj, String fieldName)
{
Field field = null;
for (Class<?> clazz = obj.getClass(); clazz != Object.class; clazz = clazz.getSuperclass())
{
try
{
field = clazz.getDeclaredField(fieldName);
break;
}
catch (NoSuchFieldException e)
{
System.out.println("catch NoSuchFieldException.");
//这里不用做处理,子类没有该字段可能对应的父类有,都没有就返回null。
}
}
return field;
}
/**
* 利用反射设置指定对象的指定属性为指定的值.
*
* @param obj 目标对象
* @param fieldName 目标属性
* @param fieldValue 目标值
*/
public static void setFieldValue(Object obj, String fieldName, String fieldValue)
{
Field field = ReflectUtil.getField(obj, fieldName);
if (field != null)
{
try
{
field.setAccessible(true);
field.set(obj, fieldValue);
System.out.println("success!");
}
catch (IllegalArgumentException e)
{
System.out.println("++++++setFieldValue IllegalArgumentException:::+++++++" + e);
}
catch (IllegalAccessException e)
{
System.out.println("++++++setFieldValue IllegalAccessException:::+++++++" + e);
}
}
}
}
3、测试,首先注释调下面这行代码,然后在main方法中调用反射工具类进行变量set。
field.setAccessible(true);
public class Test3 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException {
Book book = new Book();
ReflectUtil.setFieldValue(book,"bookId","1");
}
}
下面是结果,报错,表示不能对private域进行操作。

我们将注释取消,再运行一下,发现成功了。

这就证明了field.setAccessible(true)的用处是赋予反射对象超级权限,绕过语言权限检查。
field.setAccessible(true) 简介的更多相关文章
- 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】
方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; priva ...
- Java 反射 getDeclareFields getModifiers setAccessible(true)
示例代码: public static Map<String, Object> dtoToMap(Object obj, String pre, String las ...
- Field.setAccessible()方法
http://blog.csdn.net/kjfcpua/article/details/8496911 java代码中,常常将一个类的成员变量置为private 在类的外面获取此类的私有成员变量的v ...
- 提高java反射速度的方法method.setAccessible(true)
转载:http://huoyanyanyi10.iteye.com/blog/1317614 提高java反射速度的方法method.setAccessible(true) package com.c ...
- 终结者单身——setAccessible(true)
首先看一下"传说"Singleton模式 package go.derek; public class Singleton{ public static int times; pr ...
- DEDECMS5.5怎样调用{dede:field.content/}做简介之类的单独页面?
很多时候,如果用dede来做一些企业公司网站,或者一些部门网站的时候.需要某些栏目是一个单页的文章,用于公司简介或者企业文化之类的.那么就要用到栏目功能的栏目内容,也就是dede的content标签. ...
- Xposed 框架 hook 简介 原理 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- [spring源码学习]一、IOC简介
一.程序实例 假设一个简单地实例,我们有一个人,人可能有姓名,年龄等属性,每天上下班的时候需要坐车,他可能做小轿车,suv等,这样一个场景.我们很容易想到如下代码: 1.人的对象类,包括两个属性,姓名 ...
- JAVA反射系列之Field,java.lang.reflect.Field使用获取方法
JAVA反射系列之Field,java.lang.reflect.Field使用获取方法. 转载https://my.oschina.net/u/1407116/blog/209383 摘要 ja ...
随机推荐
- eclipse和android studio的目录结构分析
不管你喜不喜欢,愿不愿意,自从Google宣布正式停止对于eclipse的支持,要开发android的APP,你都得乖乖的用android studio(以下简称AS)了,不过也不是什么悲伤的故事,对 ...
- 事件绑定与解除js
//Ys为元素,Sj为事件,Hs为函数,bol选择是true绑定事件,还是false解除事件 //需要提前定义a,b,c,bol function thing(Ys,Sj,Hs,bol){ var i ...
- js中的0就是false,非0就是true及案例
在处理js代码判断真假时经常会这么写. 但fun()可能得到的是数字0,这可不是表示的没有值,但是!js中的数字0就是false,非0就是true. 于是0就被无情的当做false了. 已经被这个坑过 ...
- halcon c++ 异常处理
现象 Halcon导出的C++程序,try catch不到异常.在Halcon下可以正常Catch到异常. C++代码:try{ tuple_max(hv_Length, &hv_Max ...
- SpringMVC 框架系列之初识与入门实例
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1). MVC:Model-View-Control Contr ...
- Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台
完成一套精准,漂亮图形化监控系统从这里开始第一步 Telegraf是收集和报告指标和数据的代理 它是TICK堆栈的一部分,是一个用于收集和报告指标的插件驱动的服务器代理.Telegraf拥有插件或集成 ...
- Java面试题积累
持续积累中... 1.Java支持的数据类型有哪些?什么是自动拆装箱? 数据类型分为两大种,基本类型和引用类型. 基本类型有8种:byte short int long char float doub ...
- Codeforces Round #466 (Div. 2) 题解
人生中第三次\(CF\)... 考试中切了\(A\)~\(E\) \(F\)题会做没时间写 题解 A:Points on the line 题意 给定一个数列,删最小的数,使最大差不大于一个定值 So ...
- 24时区,GMT,UTC,DST,CST时间详解
全球24个时区的划分 相较于两地时间表,可以显示世界各时区时间和地名的世界时区表(World Time),就显得精密与复杂多了,通常世界时区表的表盘上会标示着全球24个时区的城市名称,但究竟 ...
- CentOS 静态IP分配,提示Error, some other host already uses address解决办法
(一)第一 修改 ifup-eth vi /etc/sysconfig/network-scripts/ifup-eth #if ! /sbin/arping -q -c 2 -w 3 -D -I $ ...