博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 反射setAccessible()方法的使用
阅读量:5783 次
发布时间:2019-06-18

本文共 1215 字,大约阅读时间需要 4 分钟。

首先看下面的代码:

public class A
{
private int data=0;
}

public class B

{
public static void main(String[] args)
{
A a1 = new A();

//获得A类中所有定义的属性    Field[] fields = a1.getClass().getDeclaredFields();   //对所有属性设置访问权限  当类中的成员变量为private时 必须设置此项    AccessibleObject.setAccessible(fields, true); /*****  个人觉得只要Field.setAccessible(true); 之后,即使是final关键字标示过得属性也可以有访问权限!这样的反射会改变JAVA的结构,   甚至你的代码可维护性,你完全可以 改别的代码里面的值 ,所以通过反射能做一些让你无法想象的东西。。   for(f : fields){  //对单个属性设置访问权限  f.setAccessible(true);  } ******/    try    {        //   获取当前对象a1中当前Field的value          System.out.println(fields[0].toString() + "=" + fields[0].get(a1));        fields[0].setInt(a1, 150);        System.out.print(fields[0].toString() + "=" + fields[0].get(a1));    } catch (IllegalAccessException ex1)    {    } catch (IllegalArgumentException ex1)    {    }}

}

以上代码的输出结果为:
private int reflectiontest.A.data=0
private int reflectiontest.A.data=150

在这个过程中对象a1的private类型字段值被修改了,这是否算是破坏了Java的访问规则呢?

一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种访问,而由于反射类中的Field,Method和Constructor继承自AccessibleObject,因此,通过在这些类上调用setAccessible()方法,我们可以实现对这些字段的操作。

转载于:https://blog.51cto.com/maplebb/2160627

你可能感兴趣的文章
LINUX下防恶意扫描软件PortSentry
查看>>
由数据库对sql的执行说JDBC的Statement和PreparedStatement
查看>>
springmvc+swagger2
查看>>
软件评测-信息安全-应用安全-资源控制-用户登录限制(上)
查看>>
我的友情链接
查看>>
Java Web Application 自架构 一 注解化配置
查看>>
如何 debug Proxy.pac文件
查看>>
Python 学习笔记 - 面向对象(特殊成员)
查看>>
Kubernetes 1.11 手动安装并启用ipvs
查看>>
Puppet 配置管理工具安装
查看>>
Bug多,也别乱来,别被Bug主导了开发
查看>>
sed 替换基础使用
查看>>
高性能的MySQL(5)创建高性能的索引一B-Tree索引
查看>>
oracle备份与恢复--rman
查看>>
图片变形的抗锯齿处理方法
查看>>
Effective C++ Item 32 确保你的 public 继承模子里出来 is-a 关联
查看>>
phpstorm安装laravel-ide-helper实现自动完成、代码提示和跟踪
查看>>
python udp编程实例
查看>>
TortoiseSVN中图标的含义
查看>>
Tasks and Back stack 详解
查看>>