目录
一、工具类:
TestMain.java
/**
* @author: ssm
* @date: 2019/7/5 9:09
*/
public class TestMain {
public static void main(String[] args) {
Object object = new Student(" 沃特 华生 "," 12 3 4 5 6",16);
object = replaceBlankSpace(object);
Student student = (Student)object;
System.out.println(student);
}
/**
* @Description : 为object中的所有String属性去除空格字符
*
* @param object 待处理的实体对象
* @return : java.lang.Object
* @author : ssm
* @date : 2019/7/21 11:23
*/
public static Object replaceBlankSpace(Object object){
//获取该类中所有的域(属性)
Field[] fields = object.getClass().getDeclaredFields();
for(Field field : fields){
//对所有的属性判断是否为String类型
if(field.getType().equals(String.class)){
//将私有属性设置为可访问状态
field.setAccessible(true);
try {
String string = (String)field.get(object);
//将所有的空格字符用""替换
string = string.replaceAll(" ","");
//相当于调用了set方法设置属性
field.set(object,string);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return object;
}
}
Student.java
package com.qcby.entity;
/**
* @Author: ssm
* @Date: 2019/7/21 10:31
*/
public class Student {
private String name;
private String password;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
public Student(String name, String password, int age) {
this.name = name;
this.password = password;
this.age = age;
}
public Student() {
}
}
二、原理
以下我将在阐述我的思路的同时,表述我所遇到的问题,以及JAVA中一些函数的解释.
1.首先获取该实体类下的所有属性
首先通过Class获取该类,通过Class获取该类中所有声明的属性.
在获取属性时,我首先是调用了Class中的getFields方法,得到的结果却是数组长度为0.
Field[] fields = object.getClass().getFields();//fields的长度为零
在Class中查看getFields的说明:
/**
* @return the array of {@code Field} objects representing the
* public fields
*/
@CallerSensitive
public Field[] getFields() throws SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
return copyFields(privateGetPublicFields(null));
}
所以这个方法返回的是public域,而getDeclaredFields()方法返回的却是所有被声明的域.我在Student类中声明的域访问权限都是private,所以getFields的结果为空.
2.判断该属性是否为String类型
通过Field.getType得到该属性的类型,通过Class中的equals方法判断是不是String类型,如果是则进行去除空格的处理.
3.强转为String并获取它的值
Student类中,我声明的都是私有域,由于Java的封装性,我不能直接访问它的值,所以要先通过setAccessible方法将它设置为可访问状态,然后获取它的值进行处理.
4.去除空格处理并放回传入对象中
通过Field.set()方法,将处理后的值设置到对象的域中.
结语:
该工具类只是实现了对实体中属性的改变,没有进行执行速度的考虑,请大家谨慎使用.