使用反射获取对象属性的坑

简介: 使用反射获取对象属性的坑

要么庸俗,要么孤独——叔本华

前两天遇到一个坑,当时我通过使用getDeclaredFields()函数获取对象属性时发现一个问题:

获取到的属性的顺序不对,结果我自己一看介绍

原来,它是无序的

所以我们为了解决这个问题

首先自定义一个注解用于制定排序规则

package com.ruben.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @ClassName: BeanFieldSort
 * @Description:
 * @Date: 2020/9/11 22:18
 * *
 * @author: achao<achao1441470436 @ gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BeanFieldSort {
    /**
     * 序号
     *
     * @return
     */
    int order();
}

然后在需要排序的bean上加上这个注解

package com.ruben.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @ClassName: BeanFieldSort
 * @Description:
 * @Date: 2020/9/11 22:18
 * *
 * @author: achao<achao1441470436 @ gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BeanFieldSort {
    /**
     * 序号
     *
     * @return
     */
    int order();
}

最后是排序的方法,这里使用java8的stream

package com.ruben;
import com.ruben.annotation.BeanFieldSort;
import com.ruben.pojo.UserInfo;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @ClassName: FieldDemo
 * @Description:
 * @Date: 2020/9/11 22:14
 * *
 * @author: achao<achao1441470436 @ gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
public class FieldDemo {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        //获取对象
        Class<UserInfo> userInfoClass = UserInfo.class;
        //创建对象
        UserInfo userInfo = userInfoClass.newInstance();
        System.out.println(userInfo);
        //获取bean中所有字段
        Field[] fields = userInfoClass.getDeclaredFields();
        //遍历
        for (Field field : fields) {
            //把private属性设为可修改
            field.setAccessible(true);
            field.set(userInfo, "yeah!");
            System.out.println(field.getName());
        }
        System.out.println("------------");
        //排序
        List<Field> fieldList = Arrays
                .stream(fields)
                .sorted(Comparator.comparingInt(f -> f
                        .getAnnotation(BeanFieldSort.class).order()))
                .collect(Collectors.toList());
        //遍历输出结果
     fieldList.stream().map(Field::getName).forEach(System.out::println);
        System.out.println(userInfo);
    }
}

输出结果为

可以看到排序前和排序后的结果

关键就是这一句

List<Field> fieldList = Arrays.stream(fields).sorted(Comparator.comparingInt(f -> f.getAnnotation(BeanFieldSort.class).order())).collect(Collectors.toList());

sorted()函数中传入排序规则

就是这样啦,希望对大家有所帮助

相关文章
|
7月前
|
XML Java 数据格式
spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象
spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象
88 0
|
3月前
|
存储 Rust Go
通过对象的地址获取对象
通过对象的地址获取对象
30 0
|
4月前
|
存储 JavaScript 前端开发
对象的属性方法和深浅拷贝
总结,理解对象的属性和方法对于编程是基础而重要的,而掌握深浅拷贝的差异和使用场合则是编程的高级技能,它能帮助你有效地管理数据的完整性和独立性。
22 0
|
Java API
Java反射(通过反射获取构造函数、方法、属性)
1.通过反射获取构造函数,2.通过反射获取方法,3.通过反射调用成员属性
124 0
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
96 0
|
Java
【JAVA】反射获取对象/LIST中对象属性
【JAVA】反射获取对象/LIST中对象属性
421 0
|
Java 数据库
java反射机制查找类的属性并赋值
先说一下需求:最近做一个项目其中需要将前台传来的数组存到数据库,但是这个表里有15个字段,集合是不固定的,然后要把这个集合的数值赋给这个类的相应属性,然后存到数据库中。集合长度应小于等于这个类属性的个数。
333 0
【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
188 0
|
XML 前端开发 应用服务中间件
获取对象属性值改动的属性集合的正确姿势(拒绝大量If-else代码)
在业务场景中可能有这样的需求: 同一个类的两个对象(一个数数据库中获取的上一次的属性,一个是前端传来的修改过的属性),需要判断哪个属性被修改了。 那么有一些童鞋可能采用大量的if-else代码块对需要关注的属性进行判断。
147 0
|
Java
构造器、对象数组、对象属性、静态实例块、this关键字
它的名字:构造函数、构造方法、初始化方法。 构造条件? 以后我们如何去使用构造器? 你觉得那些对象中那些属性值是必要的,你就在构造器中提出来(就是你如果想创造对象必须要传入我所需要的参数) public class Dog {//这里就是一个简单的类、狗的类 String name; .
1189 0