码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java通过反射机制获取数据类对象的属性及方法


    Java通过反射机制获取数据类对象的属性及方法

    通过反射机制获取类对象的所有属性以及相应的get、set方法

    • 遍历类对象的所有属性

    • //可以使用getDeclaredFields()方法获取对象的所有属性
      AutoClass autoClass = new AutoClass();		// 先初始化一个类
      Field[] fields = autoClass.getClass().getDeclaredFields();	// 获取对象的所有属性
      for (Field item : fields) {
          String name = item.getName();	// 获取对象属性名
          String typeName = item.getGenericType().getTypeName();	// 获取对象属性的类型
          System.out.printf("属性名:%s,类型:%s\n", name, typeName);
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 获取属性的get、set方法

    • // 一般而言每个属性都有其get和set方法
      // 通过方法名获取get方法
      Method getMethod = autoClass.getClass().getMethod("getId");
      // 调用get方法
      String invoke = (String) getMethod.invoke(autoClass);
      System.out.println(invoke);
       
      // 通过方法名获取set方法,由于set方法是有参数的,所以这里也需要定义set方法的参数类型
      Method setMethod = autoClass.getClass().getMethod("setId", String.class);
      // 调用set方法
      setMethod.invoke(autoClass, "gftz");
      System.out.println(autoClass.getId());
       
      // invoke方法中的autoClass表示autoClass这个指定对象调用相应方法
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

    通过反射机制实现类对象的实例化

    • 工具类

    • package utils;
       
      import java.lang.reflect.InvocationTargetException;
      import java.lang.reflect.Method;
      import java.math.BigDecimal;
      import java.util.Date;
       
      /**
       * @description: 数据类的相关操作
       **/
      // 由于为了让这个工具类能够通用,故而用了泛型,对其不了解需要自行百度一下。
      public class ObjectOperate {
       
      /**
       * 设置数据类对象的属性
       * @param obj   数据类对象的实例
       * @param name  属性名
       * @param type  属性类型名
       * @param val   需要存入的属性值
       * @throws NoSuchMethodException
       * @throws InvocationTargetException
       * @throws IllegalAccessException
       */
          public void setValues(T obj, String name, String type, Object val) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
              Method method = null;
              // 通过属性类型来获取相应的方法以及强制转化属性值并初始化相应属性
              // 这里考虑到了大部分常用的数据类型,可拿来即用。
              switch (type){
                  case "int":
                      method = obj.getClass().getMethod(name, int.class);
                      method.invoke(obj,(int)val);
                      break;
                  case "short":
                      method = obj.getClass().getMethod(name, short.class);
                      method.invoke(obj,(short)val);
                      break;
                  case "long":
                      method = obj.getClass().getMethod(name, long.class);
                      method.invoke(obj,(long)val);
                      break;
                  case "float":
                      method = obj.getClass().getMethod(name, float.class);
                      method.invoke(obj,(float)val);
                      break;
                  case "double":
                      method = obj.getClass().getMethod(name, double.class);
                      method.invoke(obj,(double)val);
                      break;
                  case "boolean":
                      method = obj.getClass().getMethod(name, boolean.class);
                      method.invoke(obj,(boolean)val);
                      break;
                  case "java.lang.String":
                      method = obj.getClass().getMethod(name, String.class);
                      method.invoke(obj,(String)val);
                      break;
                  case "java.util.Date":
                      method = obj.getClass().getMethod(name, Date.class);
                      method.invoke(obj,(Date)val);
                      break;
                  case "java.math.BigDecimal":
                      method = obj.getClass().getMethod(name, BigDecimal.class);
                      method.invoke(obj,(BigDecimal)val);
                      break;
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
    • 使用案例

    • // 模拟案例数据
      List params = new ArrayList<>();
      params.add(UUID.randomUUID().toString().replaceAll("-", ""));
      params.add(18);
      params.add(new Date());
      params.add(false);
      params.add(new BigDecimal(888888.8));
       
      // 初始话类型操作的工具类
      ObjectOperate objectOperate = new ObjectOperate<>();
      // AutoClass使用到上面的,故不再给出AutoClass类
      AutoClass autoClass = new AutoClass();
      Field[] fields = autoClass.getClass().getDeclaredFields();
      for (int i = 0; i < fields.length; i++) {
          String name = fields[i].getName();	// 属性名
          // 设置为属性的set方法名,如:属性名为id,对应set方法名为setId
          name = "set"+name.substring(0, 1).toUpperCase() + name.substring(1);
          String typeName = fields[i].getGenericType().getTypeName();	//属性类型名
          try {
              objectOperate.setValues(autoClass,name,typeName,params.get(i));	// 初始化对象的属性
          } catch (NoSuchMethodException e) {
              e.printStackTrace();
          } catch (InvocationTargetException e) {
              e.printStackTrace();
          } catch (IllegalAccessException e) {
              e.printStackTrace();
          }
      }
      System.out.println(autoClass.toString());
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
    • 相关阅读:
      浅谈web性能测试
      [南京大学]-[软件分析]课程学习笔记(一)-introduction
      leetcode:66. 加一(python3解法)
      ELK企业级日志分析系统
      微信朋友圈还可以这么玩?
      CSDN,毕业生有话说!在如此疯狂的年代如何寻找自己的方向?迈向社会的第一步
      【JavaScript】面试手撕节流
      Vue3 源码阅读(10):组件化 —— 实现原理
      PyQt5_股票策略校验工具_升级版
      计算机基本知识1
    • 原文地址:https://blog.csdn.net/Andrew_Chenwq/article/details/133204295
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号