所有分类
  • 所有分类
  • 未分类

Spring工具类-ReflectUtils的使用

简介

本文介绍Spring的ReflectUtils的使用。

ReflectUtils工具类的作用:便利地进行反射操作。

Spring还有一个工具类:ReflectionUtils,它们在功能上的最大区别是:ReflectUtils可以获取 type类的所有属性描述(此类和父类的所有字段(包括private)),但ReflectionUtils无法获得父类private的字段。

示例

需求:通过反射的方式,将父类的pageSize属性改为30。

测试类

package com.knife.controller;

import com.knife.entity.User;
import org.springframework.cglib.core.ReflectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@RestController
public class HelloController {

    @GetMapping("/test")
    public String test() {
        User user = new User();
        user.setId(3L);
        user.setUserName("Tony");
        user.setCurrent(4);
        user.setPageSize(20);

        Class<? extends User> aClass = user.getClass();

        System.out.println("-------- 所有的属性名 --------");
        PropertyDescriptor[] beanProperties = ReflectUtils.getBeanProperties(aClass);
        for (PropertyDescriptor beanProperty : beanProperties) {
            String name = beanProperty.getName();
            System.out.println(name);

            if ("pageSize".equals(name)) {
                Method writeMethod = beanProperty.getWriteMethod();
                try {
                    writeMethod.invoke(user, 30);
                } catch (IllegalAccessException | InvocationTargetException e) {
                    throw new RuntimeException(e);
                }
            }
        }

        System.out.println("-------- 新的字段值(pageSize)");
        System.out.println(user.getPageSize());

        return "test success";
    }
}

Entity

package com.knife.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = true)
public class User extends PageRequest{
    private Long id;

    private String userName;

}
package com.knife.entity;

import lombok.Data;

@Data
public class PageRequest {
    private Integer current = 0;

    private Integer pageSize = 10;
}

结果

-------- 所有的属性名 --------
current
id
pageSize
userName
-------- 新的字段值(pageSize)
30

获取PropertyDescriptor

方法说明
public static PropertyDescriptor[] getBeanProperties(Class type)获取 type类的所有属性(此类和父类的所有字段(包括private))
public static PropertyDescriptor[] getBeanGetters(Class type)获取 type类的所有读的描述
public static PropertyDescriptor[] getBeanSetters(Class type)获取 type类的所有写的描述

PropertyDescriptor是JDK原生的类,其用法见:

​Java之反射-PropertyDescriptor的使用​ – 自学精灵

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录