有时候吧,拿到前端的表单数据,由于用户的操作,存在前后空格啥的,就经常需要对一个类里面的所有字段的所有属性的值进行trim()化,当一个类有个20 30字段属性的时候,无脑重复操作,很是不爽。
今天花了半个早上了解了java类的反射机制,利用反射机制写了一个工具类。主要是网上找不到啊。。。那只能自己造轮子了。转发的话备注下出处链接谢谢。
来上正文了:
```java
package com.hikvision.ldadoss.utils;
import com.hikvision.ldadoss.dto.UserDto;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class StringCUtil {
// 整个类的所有string类型字段去空值,trim() 去空
public static Object removeSpaces(Object object) {
Class<?> clazz = object.getClass();
// 获取到所有的属性值
Field[] fields = clazz.getDeclaredFields();
Method setMethod = null;
Method getMethod = null;
Object obj1 = null;
for (int i = 0; i < fields.length; i++) {
//判断属性是否为字符类型
if (fields[i].getGenericType().toString().equals("class java.lang.String")) {
try {
//获取到当前字段名称,并首字母大写
String itemName =titleCase(fields[i].getName());
//根据属性名获取到方法名,再根据方法名获取到方法
getMethod = clazz.getMethod("get" +itemName);
setMethod = clazz.getMethod("set" +itemName, String.class);
//执行获取到的方法,并传入参数,获取到当前字段对应的属性值
String val = (String) getMethod.invoke(object);// 调用getter方法获取属性值
//执行set类型方法,为当前字段赋值为.trim()后的新值
obj1 = setMethod.invoke(object, val.trim());
} catch (Exception e) {
e.printStackTrace();
}
}
}
return object;
}
//首字母大写
public static String titleCase(String s) {
char[] c = s.toCharArray();
if ((c[0] >= 'a') && (c[0] <= 'z')) {
c[0] -= 32;
}
return new String(c);
}
public static void main(String args[]) {
//随便一个自定义的类,就是前端拿到的表单。。。
UserDto userDto = UserDto.builder().name(" 测试 ").address(" 世界 中国 ").email(" 2125@qq.com").build();
System.out.println(userDto.toString());
removeSpaces(userDto);
System.out.println(userDto.toString());
}
}
测试的话,可以导入下面的实体类后,直接调用工具类内的main()方法进行测试。
//表单接收类
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserDto {
String name;
String address;
String email;
}
备注:
UserDto 是前端拿到的表单接收的类,自行更换。
附上测试结果
文末:
感谢 评论区老哥 取个破名真费劲 指点出错误。