首页 > 文章列表 > Java反射如何获取字段的值?

Java反射如何获取字段的值?

java
177 2023-04-28

Java反射怎么获取字段属性值

Java反射获取字段属性值

反射获取Java类的所有字段,包括所有父类中的字段。 类自身的字段可直接通过方法

getDeclaredFields()【获取所有修饰符字段】或者getFields()【获取public修饰的字段】获取, 但父类中的字段暂时没有发现直接获取的方式。

需要递归获取所有的父类, 然后获取他们的字段, 最终获取到类的所有字段。 

如果要获取字段值, 则需要设置字段可访问即:field.setAccessible(true);  field为reflect包下的Field类

案例

1. 父类

package com.carl.study.springboot.bean; 

import lombok.Data;

import lombok.experimental.Accessors;

 

/**

 * @author changez

 * @desc

 * @date 2019/3/10 11:30

 */

@Data

@Accessors(chain = true)

public class BeanBasic {

 

    private Integer id;

    private Long createTime;

    private Long updateTime;

}

2. 子类

package com.carl.study.springboot.bean; 

import lombok.Data;

import lombok.EqualsAndHashCode;

import lombok.ToString;

import lombok.experimental.Accessors;

 

/**

 * @author changez

 * @desc

 * @date 2019/3/10 11:17

 */

@Data

@EqualsAndHashCode(callSuper = true)

@ToString(callSuper = true)

@Accessors(chain = true)

public class Student extends BeanBasic{

 

    private String name;

    private String address;

}

3. 测试类,获取student类的所有字段

package test.lombok; 

import com.carl.study.springboot.bean.Student;

import org.junit.Test; 

import java.lang.reflect.Field;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

 

/**

 * @author changez

 * @desc Java反射获取类的所有属性.

 * @date 2019/3/10 11:41

 */

public class LombokTest {

 

    @Test

    public void getParentField(){

        Student stu1 = new Student();

        stu1.setName("student-name")

            .setAddress("student1-address")

            .setId(1)

            .setCreateTime(20190310140423L)

            .setUpdateTime(20190310140423L)

        ;

 

        Class clazz = Student.class;

        List<Field> allFields = new ArrayList<>(100);

 

        // 获取当前对象的所有属性字段

        // clazz.getFields():获取public修饰的字段

        // clazz.getDeclaredFields(): 获取所有的字段包括private修饰的字段

        allFields.addAll(Arrays.asList(clazz.getDeclaredFields()));

 

        // 获取所有父类的字段, 父类中的字段需要逐级获取

        Class clazzSuper = clazz.getSuperclass();

 

        // 如果父类不是object,表明其继承的有其他类。 逐级获取所有父类的字段

        while (clazzSuper != Object.class) {

            allFields.addAll(Arrays.asList(clazzSuper.getDeclaredFields()));

            clazzSuper = clazzSuper.getSuperclass();

        }

 

        allFields.stream().forEach(field -> {

 

            // 设置字段可访问, 否则无法访问private修饰的变量值

            field.setAccessible(true);

            try {

                // 获取字段名称

                String fieldName = field.getName();

 

                // 获取指定对象的当前字段的值

                Object fieldVal = field.get(stu1);

                System.out.println(fieldName+"="+fieldVal);

            } catch (IllegalAccessException e) {

                e.printStackTrace();

            }

        });

    }

}

4. 结果输出

反射对象获取属性和值凭借成string

描述

有些时候会用到把穿过来的对象用kv的形式拼接这个时候用反射就很不错

直接上代码

public class FanSeVo {

    private String name;

    private String id;

    //.......

    // 如果是跟外部程序或者接口对接的话,下面还可以加2个属性,一个是相互约定的秘钥,一个//是排除秘钥之后对属性和值做凭借之后的MD5加密之后的值,可以做数据安全考虑,防止传输过程数据被篡改

}
package com.ycj.my_all_demo.fanse;

import java.lang.reflect.Field;

import java.util.HashMap;

/**

 * @author ycj

 * @data 17:55

 */

public class FanSe {

    public static void main(String[] args) {

        FanSeVo fanSeVo = new FanSeVo("1", "2");

        Field[] fields = fanSeVo.getClass().getDeclaredFields();

        HashMap<String, String> map = new HashMap<>();

        for (Field field : fields) {

            field.setAccessible(true);

            try {

            // 把对象的属性做k,值做v

            // 当然中间还可做其他的业务操作,比如跳过某些属性什么的

                String name = field.getName();

                String s = field.get(fanSeVo).toString();

                map.put(name,s);

                System.out.println();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

        // 吧map数据转成str,kv的形式

        String strByMap = getStrByMap(map);

        System.out.println(strByMap);//name1id2

    }

    public static String getStrByMap(HashMap<String, String> map){

        StringBuilder str = new StringBuilder();

        map.forEach((k,v)->{str.append(k).append(v);});

        return str.toString();

    }

}