文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-02 16:36

关注

今天小编给大家分享一下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; @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; @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; 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. 结果输出

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

反射对象获取属性和值凭借成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;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();    }}

以上就是“Java反射怎么获取字段属性值”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯