利用java反射机制修改属性值
利用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反射机制修改属性值相关推荐
- java高级反射(一),通过反射批量修改属性值set,get方法 Field,对属性值进行统一操作
通过反射批量修改属性值set,get方法 Field 需求说明:对接一个系统,对方系统要求每个字段value值加密,加密方法为WebAppAESUtil.encrypt,做之前就想做一个对属性统一操作 ...
- java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作
一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- 利用Java反射机制降低代码圈复杂度
利用Java反射机制降低代码圈复杂度 在实际的工作中,我遇到了项目里老代码存在圈复杂度过高的问题,在提交代码的时候通不过CI(代码检查)的Lizard复杂度检查,所以迫切需要解决这个问题,运用Java ...
- 利用java反射机制进行对象操作
我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...
- java invoke 泛型_利用Java反射机制和泛型,全自动解析json
有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量 Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去 ...
- 利用Java反射机制调用含数组参数的方法
http://yourmitra.wordpress.com/2008/09/26/using-java-reflection-to-invoke-a-method-with-array-parame ...
- 利用Java反射机制调用类的私有方法
利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...
- java反射 获取Object属性值
项目场景: 一个添加员工信息的功能,通过shiro获取当前登录用户的信息,取出其中的createId的值,在通过set方法写入. 问题描述: 通过获取的登录用户的信息发现,它是一个Object对象,然 ...
最新文章
- [Objective-C]OC中字典基本概念和常用方法(NSDictionary和NSMutableDictionary)
- DevExpress的TextEdit、RadioGroup、ColorPickEdit设置默认值
- 【C/C++多线程编程之八】pthread条件变量
- [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
- 关于CacheLookup一个有趣的问题
- activex控件有什么用_你知道怎样用Excel打印「条形码」吗?
- Bootstrap学习笔记系列1-------Bootstrap网格系统
- 靠写代码赚钱的一些门路
- java中的字符串String的不可变性
- 【高效程序员系列】1、好马配好鞍——舒适的工作环境
- 【无人机】【2011.04】【含源码】四旋翼无人机的仿真与控制
- 设计过程(概要设计和详细设计)
- Spring-statemachine有限状态机(FSM)使用教程详解
- LOL自制皮肤0-介绍我自己
- Bitbucket相关
- 【2020】【论文笔记】太赫兹新型探测——太赫兹特性介绍、各种太赫兹探测器
- Linux系统中社保卡阅读
- 智能小车的超声波避障
- 两个日期月数差值计算
- C++类的交叉引用问题
热门文章
- 自动化迁移七牛云的数据到阿里云OSS
- 我的世界java版特别卡怎么办_MCjava优化卡顿解决办法?我的世界运行咋办
- 三极管基极偏置电路原理应用于继电器的驱动电路的分析
- 为什么Django还是比Flask好一点点?
- CocosCreator控制物体移动
- vue异步加载amap高德地图,解决刷新浏览器地图不显示问题
- 记录链连接mysql数据库,密码正确却被拒绝访问问题
- 配置数据库文件系统(DBFS) (文档 ID 2060485.1)
- FRM模型二:时间序列建模
- 金融机构系统性风险分析(Domestic+MES模型)200701-202012