通过反射对一个实体类中的所有String属性进行去除空格符(' ')处理(附工具类)

本文介绍了一个利用Java反射对实体类中的所有String属性去除空格的工具类实现,详细解释了获取属性、判断类型、设置访问权限及处理空格的步骤。注意,该工具类未考虑执行效率,使用时需谨慎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

一、工具类:

二、原理


一、工具类:

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()方法,将处理后的值设置到对象的域中.

结语:

该工具类只是实现了对实体中属性的改变,没有进行执行速度的考虑,请大家谨慎使用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值