Java初始化对象属性值的方式

Java初始化对象属性值的方式

1、数据库设计

一般我们在数据库设计时很多字段都会设计一个非空值,如下sql:

CREATE TABLE `student` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` Varchar(64) Not Null Default '' Comment '姓名',
  `age` int(11) Not Null Default 0 Comment '年龄',
  `addr` Varchar(64) Not Null Default '' Comment '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

实体类对象,一般是通过某种工具自动生成,如下(我写的是jpa的写法,其他类似):

@Data
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private Integer age;

    @Column(name = "addr")
    private String addr;
}

这个时候,我们在做对象插入的时候。以下面的某种写法

Student student = new Student();
student.setName("zhangsan");

//InitValue2Obj.initZeroAndEnpty(student);
studentReposity.save(student);

很明显是不正确的,会报如下错误:

Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'addr' cannot be null

这样我们就只能硬性的把所有属性全部赋值。如果没有值就给一个空值或者默认值。但是当随着业务的开展,我们增加了一些列的时候,把一个列的属性设置为非空,这样对于前人的所有insert都要进行一个修改。因此写了一个默认工具类,设置一个初始属性值。

2、设置对象初始属性值工具类

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;

public class InitValue2Obj {

    /**
     * 设置对象初始属性值
     * @param object
     * @throws Exception
     */
    public static void initZeroAndEnpty(Object object) throws Exception {
        Class cls = object.getClass();
        Field[] fields = cls.getDeclaredFields();
        Method[] methods = cls.getDeclaredMethods();
        for (Field field:fields
             ) {
            Object o = getFieldValueByName(field.getName(), object);
            if (null == o) {
                Method method = getMethod(field.getName(), methods);
                if(field.getGenericType().getTypeName().equals("java.lang.String")) {
                    method.invoke(object, "");
                }else if(field.getGenericType().getTypeName().equals("java.lang.Integer")) {
                    method.invoke(object, 0);
                }else if(field.getGenericType().getTypeName().equals("java.lang.Long")) {
                    method.invoke(object,0L);
                }else if(field.getGenericType().getTypeName().equals("java.util.Date")) {
                    method.invoke(object, new Date());
                }else if(field.getGenericType().getTypeName().equals("java.lang.Boolean")) {
                    method.invoke(object, false);
                }
            }
        }
    }

    /**
     * 获取相应属性的set方法
     * @param fieldName
     * @param methods
     * @return
     */
    private static Method getMethod(String fieldName, Method[] methods) {
        for(Method method: methods) {
            if(!method.getName().startsWith("set")) {
                continue;
            }
            if(method.getName().toLowerCase().endsWith(fieldName.toLowerCase())) {
                return method;
            }
        }
        return null;
    }

    /**
     * 获取相应属性的属性值
     * @param fieldName
     * @param o
     * @return
     */
    private static Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter, new Class[] {});
            Object value = method.invoke(o, new Object[] {});
            return value;
        } catch (Exception e) {
            System.out.println("属性不存在");
            return null;
        }
    }
    
}

这样在我们调用insert方法时,只需要增加这一步

InitValue2Obj.initZeroAndEnpty(student);

后续列的变动将不会受到影响


可能我不足,但我一直在成长

你可能感兴趣的:(Java)