Java反射设置/获取对象属性值三种方式

 更新时间:2023年11月07日 09:30:14   作者:zhuzicc  
这篇文章主要给大家介绍了关于Java反射设置/获取对象属性值的三种方式,反射机制的用途非常多,比如获取方法,属性名和属性值等,甚至可以获取标签等标签属性,需要的朋友可以参考下

本文总结:Java 通过反射设置对象属性值,或者获取对象属性值,编码过程中反射结合泛型使用可以代码复用,减少冗余代码;

食用建议:配合场景案例食用更佳;

设置/获取属性

实体类对象:

@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentScore {
    /**
     * 名称
     */
    private String name;
    /**
     * 科目
     */
    private String subject;
    /**
     * 成绩
     */
    private Integer score;
}

方式一

通过Field操作属性:

public void method1() throws Exception {
        Class<StudentScore> cls = StudentScore.class;
        StudentScore obj = new StudentScore();
        StudentScore obj2 = new StudentScore();
        /*
         * 设置属性
         */
        Field nameField = cls.getDeclaredField("name");
        nameField.setAccessible(true);
        nameField.set(obj, "张三");

        Field subjectField = cls.getDeclaredField("subject");
        subjectField.setAccessible(true);
        subjectField.set(obj, "语文");

        Field scoreField = cls.getDeclaredField("score");
        scoreField.setAccessible(true);
        scoreField.set(obj, 100);

        /*
         * 获取属性
         */
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            String s = Modifier.toString(field.getModifiers());
            // 排除final修饰的属性
            if (!s.contains("final")) {
                field.setAccessible(true);
                // 通过filed获取设置属性
                System.out.printf("获取属性值,当前属性:%s,值:%s%n", field.getName(), field.get(obj));
                // obj对象属性值赋值给obj2
                field.set(obj2, field.get(obj));
            }
        }
        System.out.println("method1 obj:" + JSONObject.toJSONString(obj));
        System.out.println("method1 obj2:" + JSONObject.toJSONString(obj2));
    }

运行结果:

方式二

通过set方法:

public void method2() throws Exception {
        Class<StudentScore> cls = StudentScore.class;
        StudentScore obj = new StudentScore();

        /*
         * 设置属性
         */
        Method setName = cls.getMethod("setName", String.class);
        setName.invoke(obj, "李四");

        Method setSubject = cls.getMethod("setSubject", String.class);
        setSubject.invoke(obj, "语文");

        Method setScore = cls.getMethod("setScore", Integer.class);
        setScore.invoke(obj, 114);

        /*
         * 获取属性
         */
        Method getName = cls.getMethod("getName");
        System.out.printf("获取属性值,当前属性:%s,值:%s%n", "name", getName.invoke(obj));
        Method getSubject = cls.getMethod("getSubject");
        System.out.printf("获取属性值,当前属性:%s,值:%s%n", "subject", getSubject.invoke(obj));
        Method getScore = cls.getMethod("getScore");
        System.out.printf("获取属性值,当前属性:%s,值:%s%n", "score", getScore.invoke(obj));
        System.out.println("method2:" + JSONObject.toJSONString(obj));
    }

运行结果:

方式三

通过属性名:

public void method3() throws Exception {
        Class<StudentScore> cls = StudentScore.class;
        StudentScore obj = new StudentScore();
        /*
         * 设置属性
         */
        PropertyDescriptor namePd = new PropertyDescriptor("name", cls);
        Method writeMethod = namePd.getWriteMethod();
        writeMethod.invoke(obj, "王五");

        PropertyDescriptor subjectPd = new PropertyDescriptor("subject", cls);
        Method subjectMethod = subjectPd.getWriteMethod();
        subjectMethod.invoke(obj, "语文");

        PropertyDescriptor scorePd = new PropertyDescriptor("score", cls);
        Method scoreMethod = scorePd.getWriteMethod();
        scoreMethod.invoke(obj, 127);

        /*
         * 获取属性
         */
        Method nameRead = namePd.getReadMethod();
        System.out.printf("获取属性值,当前属性:%s,值:%s%n", "name", nameRead.invoke(obj));
        Method subjectRead = subjectPd.getReadMethod();
        System.out.printf("获取属性值,当前属性:%s,值:%s%n", "subject", subjectRead.invoke(obj));
        Method scoreRead = scorePd.getReadMethod();
        System.out.printf("获取属性值,当前属性:%s,值:%s%n", "score", scoreRead.invoke(obj));
        System.out.println("method3:" + JSONObject.toJSONString(obj));
    }

运行结果:

场景案例

场景:学生查询自己的语文考试成绩;

学生成绩对象实体类:

/**
 * 学生成绩实体
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentScore {
    /**
     * 名称
     */
    private String name;
    /**
     * 科目
     */
    private String subject;
    /**
     * 成绩
     */
    private Integer score;
}

学生对象实体类:

/**
 * 学生-张三
 */
@Data
public class StudentZS extends StudentScore {
}
/**
 * 学生-李四
 *
 */
@Data
public class StudentLS extends StudentScore {
}
/**
 * 学生-王五
 */
@Data
public class StudentWW extends StudentScore {
}

测试:

@Test
public void testDemo() {
    StudentZS student1 = new StudentZS();
    student1.setName("张三");
    scoreSystem(student1, StudentZS.class);
    System.out.println("张三查询成绩结果:" + JSONObject.toJSONString(student1));

    StudentLS student2 = new StudentLS();
    student2.setName("李四");
    scoreSystem(student2, StudentLS.class);
    System.out.println("李四查询成绩结果:" + JSONObject.toJSONString(student2));

    StudentWW student3 = new StudentWW();
    student3.setName("王五");
    scoreSystem(student3, StudentWW.class);
    System.out.println("王五查询成绩结果:" + JSONObject.toJSONString(student3));
}

/**
  * 成绩系统
  *
  * @param t   学生
  * @param cls 学生类
  * @param <T> 泛型
  */
public <T> void scoreSystem(T t, Class<T> cls) {
    // 给传入对象赋值名称
    try {
        Class<? super T> superclass = cls.getSuperclass();
        Field nameField = superclass.getDeclaredField("name");
        Type genericType = nameField.getGenericType();
        String typeName = genericType.getTypeName();
        assert "java.lang.String".equals(typeName);
        nameField.setAccessible(true);
        String studentName = nameField.get(t).toString();
        int schoolReport = 0;
        switch (studentName) {
            case "张三":
                schoolReport = 100;
                break;
            case "李四":
                schoolReport = 114;
                break;
            case "王五":
                schoolReport = 127;
                break;
        }
        Field subjectField = superclass.getDeclaredField("subject");
        subjectField.setAccessible(true);
        subjectField.set(t, "语文");
        Field scoreField = superclass.getDeclaredField("score");
        scoreField.setAccessible(true);
        scoreField.set(t, schoolReport);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

运行结果:

总结

到此这篇关于Java反射设置/获取对象属性值三种方式的文章就介绍到这了,更多相关Java反射设置/获取属性值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中YYYY-MM-dd与yyyy-MM-dd的区别及跨年问题

    Java中YYYY-MM-dd与yyyy-MM-dd的区别及跨年问题

    YYYY-MM-dd可能会导致跨年周的日期被归属到错误的年份, yyyy-MM-dd总是表示实际的日历年份,无论日期所在的周是否跨年,本文就来介绍一下两者的区别,感兴趣的可以了解一下
    2024-01-01
  • java web中对json的使用详解

    java web中对json的使用详解

    在Java Web的开发过程中,如果希望调用Java对象转化成JSON对象等操作,我们需要引入相关jar包,下面小编给大家带来了java web中对json的使用,一起看看吧
    2018-08-08
  • Java毕业设计实战之医院心理咨询问诊系统的实现

    Java毕业设计实战之医院心理咨询问诊系统的实现

    这是一个使用了java+Spring+Maven+mybatis+Vue+mysql开发的医院心理咨询问诊系统,是一个毕业设计的实战练习,具有心理咨询问诊该有的所有功能,感兴趣的朋友快来看看吧
    2022-01-01
  • 实例解析Java日期格式工具类DateUtil.java

    实例解析Java日期格式工具类DateUtil.java

    本文主要对Java日期格式工具类DateUtil.java进行实例解析。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Java IO之包装流详解

    Java IO之包装流详解

    这篇文章主要为大家介绍了Java IO之包装流,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Java统计代码的执行时间的N种方法

    Java统计代码的执行时间的N种方法

    在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Java 中比较常用的执行时间统计方法,总共包含以下 6 种,需要的朋友可以参考下
    2022-08-08
  • Spring Data分页与排序的实现方法

    Spring Data分页与排序的实现方法

    这篇文章主要给大家介绍了关于Spring Data分页与排序的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • java实现马踏棋盘的完整版

    java实现马踏棋盘的完整版

    这篇文章主要为大家详细介绍了java实现马踏棋盘的完整版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Fastjson 常用API介绍及下载地址(推荐)

    Fastjson 常用API介绍及下载地址(推荐)

    Fastjson是一个Java语言编写的高性能功能完善的JSON库。接下来通过本文给大家分享Fastjson 常用API介绍及下载地址,感兴趣的朋友一起看看吧
    2017-11-11
  • Spring事务中的事务传播行为使用方式详解

    Spring事务中的事务传播行为使用方式详解

    Spring框架作为一个轻量级的开源框架,在企业应用开发中被广泛使用,在Spring事务管理中,事务传播行为是非常重要的一部分,它定义了方法如何参与到已经存在的事务中或者如何开启新的事务,本文将详细介绍Spring事务中的几种事务传播行为,详细讲解具体使用方法
    2023-06-06

最新评论