package com.xj.util;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* @Description : 通过反射机制对Object对象中的变量进行集体变更
*/
public class ObjectModifyUtil {
private final static String ZERO_8 = "0.00000000";
private final static String ZERO_E_8 = "0E-8";
private final static String ZERO = "0.00";
private final static Integer AGE = 18;
public static void setPropertyValue(Object source) throws IllegalAccessException{
//断言 如果source为空报异常
assert source != null;
//返回Class中所有的字段,包括私有字段
Field[] fields = source.getClass().getDeclaredFields();
for (Field field : fields){
//让我们在用反射时可以访问私有变量,否则会报错
field.setAccessible(true);
/**
* Field的getModifiers()方法返回int类型值表示该字段的修饰符.其中,
* 该修饰符是java.lang.reflect.Modifier的静态属性.
* 对应表如下:
* STATIC: 8
* PUBLIC: 1
* PRIVATE: 2
* PROTECTED: 4
*/
//如果是带有“static”的变量,直接跳过
if((field.getModifiers() & Modifier.STATIC) > 0){
continue;
}
Class<?> type = field.getType();
Object value = field.get(source);
//如果是BigDecimal类型
if(type.equals(BigDecimal.class)){
if(value == null){
//如果BigDecimal类型的字段值为null,赋值为0
field.set(source, BigDecimal.ZERO);
}
}
if(value != null){
if (value.equals(new BigDecimal(ZERO_8))){
//如果BigDecimal类型的字段值为0.00000000,赋值为0,且保留小数2位
field.set(source, BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP));
}
}
//如果是String类型
if(type.equals(String.class)){
if(value != null){
if(value.equals(ZERO_8) || value.equals(ZERO_E_8)){
//如果String类型的字段值为0.00000000 或 0E-8,赋值为0.00
field.set(source, ZERO);
}
}
}
//如果是Integer类型
if(type.equals(Integer.class)){
if(value != null){
if(value != AGE ){
//当不为18岁时,要保证永远18岁
field.set(source,AGE);
}
}
}
}
}
//对工具类进行测试
public static void main(String[] args) throws Exception{
UserObject userObject = new UserObject();
System.out.println(userObject.getClass().getName() + "--变更前-->" + userObject.toString());
//调用工具类,对UserObject中变量进行变更
new ObjectModifyUtil().setPropertyValue(userObject);
System.out.println(userObject.getClass().getName() + "--变更后-->" + userObject.toString());
}
}
//定义一个类对象
class UserObject{
private BigDecimal saveMoney;
public String strSaveMoney1;
public String strSaveMoney2;
public Integer age;
//无参构造方法
public UserObject(){
saveMoney = new BigDecimal("0.00000000");
strSaveMoney1 = "0E-8";
strSaveMoney2 = "0.00000000";
age = 36;
}
public BigDecimal getSaveMoney() {
return saveMoney;
}
public void setSaveMoney(BigDecimal saveMoney) {
this.saveMoney = saveMoney;
}
public String getStrSaveMoney1() {
return strSaveMoney1;
}
public void setStrSaveMoney1(String strSaveMoney1) {
this.strSaveMoney1 = strSaveMoney1;
}
public String getStrSaveMoney2() {
return strSaveMoney2;
}
public void setStrSaveMoney2(String strSaveMoney2) {
this.strSaveMoney2 = strSaveMoney2;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//重写toString方法
@Override
public String toString() {
return "saveMoney:" + saveMoney + " strSaveMoney1:" + strSaveMoney1 + " strSaveMoney2:" + strSaveMoney2 +" age:" + age;
}
}
参考文献:
1.Field的getModifiers()方法返回int类型值表示该字段的修饰符_码眼的博客-CSDN博客
2.field.setAccessible(true)_闵浮龙的博客-CSDN博客_field.setaccessible(true)