利用java反射机制修改属性值

本文将介绍如何利用java反射机制修改属性值,废话不多说,直接上代码
1、新建一个实体类,添加属性test以及获取属性值的方法getTest()

public class ReflectTest {//测试修改属性String test = "修改前的值";public String getTest(){return test;}
}

2、新建一个测试类,利用反射机制获取类对象、方法、属性,方法对象调用invoke()执行方法

class Test{public static void main(String[] args) throws Exception {//获取ReflectTest类的class对象Class<ReflectTest> reflectTestClass = ReflectTest.class;//获取实例对象ReflectTest reflectTest = reflectTestClass.newInstance();//获取属性对象Field testField = reflectTestClass.getDeclaredField("test");//获取方法对象Method getTestMethod = reflectTestClass.getDeclaredMethod("getTest", null);//执行方法Object invoke = getTestMethod.invoke(reflectTest);System.out.println(invoke);}
}

修改前得到的打印结果如下

3、以上为默认修饰符属性未修改的情况,现在我们通过testField.set(reflectTest,“修改后的值”)修改属性值;修改默认属性代码如下:

//获取ReflectTest类的class对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//获取实例对象
ReflectTest reflectTest = reflectTestClass.newInstance();
//获取属性对象
Field testField = reflectTestClass.getDeclaredField("test");
//修改属性值
testField.set(reflectTest,"修改后的值");
//获取方法对象
Method getTestMethod = reflectTestClass.getDeclaredMethod("getTest", null);
//执行方法
Object invoke = getTestMethod.invoke(reflectTest);
System.out.println(invoke);

修改后打印结果如下:

4、默认属性可以修改,那么其他属型呢?我们依次试试public、protected,修改后打印结果均为“修改后的值”。修改private修饰的属性值时却抛出异常IllegalAccessException。原来,在利用反射机制修改私有属性的值前,需要执行setAccessible(true),这样就能绕过private的限制啦,改动代码和结果如下:

//获取属性对象
Field testField = reflectTestClass.getDeclaredField(“test”);
testField.setAccessible(true);
//修改属性值
testField.set(reflectTest,“修改后的值”);

打印结果:

5、默认、public、protected、private都修改成功了,那么如果都换成静态修饰的呢?小编一一测试之后依然是能够实现的。那么final修饰的属性是否能够被修改呢?
这里首先将属性改为final修饰:

private final String test = “修改前的值”;

修改属性的代码不变:

//获取属性对象Field testField = reflectTestClass.getDeclaredField("test");testField.setAccessible(true);//修改属性值testField.set(reflectTest,"修改后的值");//获取方法对象Method getTestMethod = reflectTestClass.getDeclaredMethod("getTest", null);//执行方法Object invoke = getTestMethod.invoke(reflectTest);System.out.println(invoke);

得到的结果如下,仍然是修改前的值:

这里可以看见我们打印类的属性值并没有改变,当前反射获取到的属性值却发生了改变,代码和结果如下:

//获取属性对象Field testField = reflectTestClass.getDeclaredField("test");testField.setAccessible(true);//修改属性值testField.set(reflectTest,"修改后的值");System.out.println(testField.get(reflectTest));

执行以上代码结果如下:

6、为了修改final修饰的类属性的值,我们要对 Java 反射包中的类进行自我反射。Field 对象有个一个属性叫做 modifiers, 它表示的是属性是否是 public, private, static, final 等修饰的组合。这里把这个 modifiers 也反射出来,进而把 nameField 的 final 约束去掉。代码如下:

//获取ReflectTest类的class对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//获取实例对象
ReflectTest reflectTest = reflectTestClass.newInstance();
//获取属性对象
Field testField = reflectTestClass.getDeclaredField("test");
//获取modifiers属性,modifiers属性也是私有的
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
//改掉testField属性的modifiers 值  按位取反再按位与 操作把 final 从修饰集中剔除掉,
// 其他特性如 private, static 保持不变
modifiers.setInt(testField,testField.getModifiers() & ~Modifier.FINAL);
testField.setAccessible(true);
//修改属性值
testField.set(reflectTest,"修改后的值");
//获取方法对象
Method getTestMethod = reflectTestClass.getDeclaredMethod("getTest", null);
//执行方法
Object invoke = getTestMethod.invoke(reflectTest);
System.out.println(invoke);

此时运行程序没有报错,但打印出来的还是修改前的值,原因是编译期间final类型的数据自动被优化,“修改前的值”是直接在常量区内取的值,我们将其换成基本数据类型也是一样,均是取得常量区的值。而使用new String(“修改前的值”)进行初始化编译期间不会被优化:

private final String test = new String(“修改前的值”);

打印结果:

本期分享就结束啦,楼主是个萌新,初次编写文章,如有不对的地方,欢迎大家留言指正哦。

利用java反射机制修改属性值相关推荐

  1. java高级反射(一),通过反射批量修改属性值set,get方法 Field,对属性值进行统一操作

    通过反射批量修改属性值set,get方法 Field 需求说明:对接一个系统,对方系统要求每个字段value值加密,加密方法为WebAppAESUtil.encrypt,做之前就想做一个对属性统一操作 ...

  2. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...

  3. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  4. 利用Java反射机制降低代码圈复杂度

    利用Java反射机制降低代码圈复杂度 在实际的工作中,我遇到了项目里老代码存在圈复杂度过高的问题,在提交代码的时候通不过CI(代码检查)的Lizard复杂度检查,所以迫切需要解决这个问题,运用Java ...

  5. 利用java反射机制进行对象操作

    我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...

  6. java invoke 泛型_利用Java反射机制和泛型,全自动解析json

    有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去 ...

  7. 利用Java反射机制调用含数组参数的方法

    http://yourmitra.wordpress.com/2008/09/26/using-java-reflection-to-invoke-a-method-with-array-parame ...

  8. 利用Java反射机制调用类的私有方法

    利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...

  9. java反射 获取Object属性值

    项目场景: 一个添加员工信息的功能,通过shiro获取当前登录用户的信息,取出其中的createId的值,在通过set方法写入. 问题描述: 通过获取的登录用户的信息发现,它是一个Object对象,然 ...

最新文章

  1. [Objective-C]OC中字典基本概念和常用方法(NSDictionary和NSMutableDictionary)
  2. DevExpress的TextEdit、RadioGroup、ColorPickEdit设置默认值
  3. 【C/C++多线程编程之八】pthread条件变量
  4. [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
  5. 关于CacheLookup一个有趣的问题
  6. activex控件有什么用_你知道怎样用Excel打印「条形码」吗?
  7. Bootstrap学习笔记系列1-------Bootstrap网格系统
  8. 靠写代码赚钱的一些门路
  9. java中的字符串String的不可变性
  10. 【高效程序员系列】1、好马配好鞍——舒适的工作环境
  11. 【无人机】【2011.04】【含源码】四旋翼无人机的仿真与控制
  12. 设计过程(概要设计和详细设计)
  13. Spring-statemachine有限状态机(FSM)使用教程详解
  14. LOL自制皮肤0-介绍我自己
  15. Bitbucket相关
  16. 【2020】【论文笔记】太赫兹新型探测——太赫兹特性介绍、各种太赫兹探测器
  17. Linux系统中社保卡阅读
  18. 智能小车的超声波避障
  19. 两个日期月数差值计算
  20. C++类的交叉引用问题

热门文章

  1. 自动化迁移七牛云的数据到阿里云OSS
  2. 我的世界java版特别卡怎么办_MCjava优化卡顿解决办法?我的世界运行咋办
  3. 三极管基极偏置电路原理应用于继电器的驱动电路的分析
  4. 为什么Django还是比Flask好一点点?
  5. CocosCreator控制物体移动
  6. vue异步加载amap高德地图,解决刷新浏览器地图不显示问题
  7. 记录链连接mysql数据库,密码正确却被拒绝访问问题
  8. 配置数据库文件系统(DBFS) (文档 ID 2060485.1)
  9. FRM模型二:时间序列建模
  10. 金融机构系统性风险分析(Domestic+MES模型)200701-202012