Java 反射设置/获取对象属性值

这篇具有很好参考价值的文章主要介绍了Java 反射设置/获取对象属性值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

✨大家好,我是【zhuzicc】~ ,一位主攻【Java】的 攻城狮!✨

欢迎对【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));
    }

运行结果:
java 反射获取属性值,Java,java,jvm,servlet

方式二

通过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));
    }

运行结果:

java 反射获取属性值,Java,java,jvm,servlet

方式三

通过属性名:

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));
    }

运行结果:

java 反射获取属性值,Java,java,jvm,servlet

场景案例

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

java 反射获取属性值,Java,java,jvm,servlet

学生成绩对象实体类:

/**
 * 学生成绩实体
 */
@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,jvm,servlet文章来源地址https://www.toymoban.com/news/detail-732210.html

到了这里,关于Java 反射设置/获取对象属性值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 基础进阶篇(十七):反射概述及获取对象的方式

    反射是指对于任何一个Class类,在 “运行的时候”,不用创建对象,就可以直接得到这个类全部成分。 在运行时,可以直接得到这个类的构造器对象:Constructor 在运行时,可以直接得到这个类的成员变量对象:Field 在运行时,可以直接得到这个类的成员方法对象:Method 这种

    2024年02月07日
    浏览(40)
  • Java通过属性名获取Object对象属性值

    通过已知的属性名称,从对象里获取数据的方式 通过将Object转为Map: 通过invoke方式: 调用方式:

    2024年02月15日
    浏览(40)
  • Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

    1.类什么时候被加载到JVM中,new,Class.forName: Class.forName(“包名.类名”); 2.创建对象的方式,反射,本质是获得类的类对象Class; 3.克隆clone,深拷贝,浅拷贝的对比; 4.序列化和反序列化的方式; Hello h; // 此时没有用Hello,jvm并没有进行类加载 看到new : new Book() Class.forName:

    2024年02月12日
    浏览(44)
  • 【Java 8 新特性】获取对象列表中的某个属性组成的列表

    1、用法示例 获取list中所有对象的某个属性 2、详细案例 UserEntity.java Test.java 输出结果: 1、Java 8 Stream 基本介绍 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合

    2024年02月10日
    浏览(47)
  • 【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。

       📝个人主页:哈__ 期待您的关注  我想要通过反射来打印如下效果的类信息。 Student类如下代码所示。  你是否有思路?如果你不了解反射的话,我来给大家简单的介绍一下反射的使用方法。 1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操

    2024年04月10日
    浏览(48)
  • java通过反射创建反射对象三种的方法

    目录 前言: 代码部分: computer类: 1.类名.class创建反射对象: 2.对象.getclass创建反射对象: 3.Class.forName(\\\"\\\")创建反射对象: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态

    2024年02月14日
    浏览(36)
  • 【Java 基础篇】Java反射:深入了解Class对象

    Java是一门强类型语言,它要求在编译时知道所有的类和对象类型。然而,有时候我们需要在运行时动态地获取和操作类的信息,这就是Java反射的用武之地。本文将深入探讨Java反射,特别是与Class对象相关的内容。 反射是一种机制,允许我们在运行时检查、获取和操作类的信

    2024年02月06日
    浏览(50)
  • 使用Java反射针对对象字段比较。

    在Java开发中,我们经常需要比较两个对象的字段差异,尤其是在处理数据同步、状态更新等场景中。本文介绍了如何使用Java反射和Stream API优化对象字段比较的过程。 类型检查 : 确保传入的两个对象属于同一类型,否则抛出异常。 使用Stream API : 利用Stream API和Lambda表达式简化

    2024年04月14日
    浏览(32)
  • Java中的反射(通过反射获取类的结构、invoke方法、获取注解)

    创建运行时类的对象是反射机制应用最多的地方。创建运行时类的对象有两种方式: 方式1:直接调用Class对象的newInstance()方法 要求: 1)类必须有一个无参数的构造器。 2)类的构造器的访问权限需要足够。 方式一的步骤 : 1)获取该类型的Class对象 2)调用Class对象的 new

    2024年02月04日
    浏览(52)
  • 【Java】常见面试题:HTTP/HTTPS、Servlet、Cookie、Linux和JVM

    努力经营当下 直至未来明朗! “抓包工具”:是个特殊的软件,相当于一个“代理程序”,浏览器给服务器的请求就会经过这个代理程序(响应也是经过该代理程序的),进一步的就能分析出请求和响应的结果如何。 fiddler可以抓取http请求,也可以开启抓取https请求。 HTTP

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包