首页 > 编程语言 >Java反射调用get/set方法,你还在这样用?

Java反射调用get/set方法,你还在这样用?

时间:2022-12-21 11:24:25浏览次数:39  
标签:set Java name invoke get 调用 article

之前有些场景下碰到需要用到反射调用JavaBean的get/set方法时都是像以下这种拼接的方式来实现方法的调用。

        Article article = new Article();
        article.setTitle("这是标题");
        article.setPublishTime(LocalDateTime.now());
        Class<? extends Article> aClass = article.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            String name = declaredField.getName();
            String getMethodName = "get" + name.substring(0, 1).toUpperCase(Locale.ROOT) + name.substring(1);
            try {
                Method method = aClass.getMethod(getMethodName);
                Object invoke = method.invoke(article);
                System.out.println(name + "=" + invoke);
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }

发现上面这种方式只能拿到当前类的属性,想要拿父类的属性还得自己写循环实现。
image

今天发现一个类Introspector可以获取一个BeanInfo,然后从BeanInfo上获取属性描述符PropertyDescriptor,然后就可以遍历调用其中的readMethodwriteMethod方法来实现对JavaBean的get/set方法调用,具体代码如下。

try {
            BeanInfo beanInfo = Introspector.getBeanInfo(article.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            Arrays.stream(propertyDescriptors)
                    .filter(p -> !"class".equals(p.getName()))
                    .forEach(pd -> {
                        try {
                            Method readMethod = pd.getReadMethod();
                            Object invoke = readMethod.invoke(article);
                            System.out.println(pd.getName() + "=" + invoke);
                        } catch (IllegalAccessException | InvocationTargetException e) {
                            e.printStackTrace();
                        }
                    });
        } catch (IntrospectionException e) {
            e.printStackTrace();
        }

这种方式还会自动把父类的属性也会列出来。如果将上面的filter拿掉会发现多了一个class属性,所以平常使用的时候需要过滤掉class属性。
image

标签:set,Java,name,invoke,get,调用,article
From: https://www.cnblogs.com/lvbok/p/16995804.html

相关文章

  • java.lang.ClassNotFoundException
    当你用Eclipse或者MyEclipse运行javaweb项目时,发现连接数据库失败,出现提示java.lang.ClassNotFoundException,你确定你的jar包添加了,那么很有可能是你项目的本地lib没有......
  • java.sql.SQLException: No value specified for parameter 12
    Stringsql="updatedishessetfoodName=?,foodPrice=?,foodWeight=?,cost_performance=?,address=?,date=?,firstCategoty=?,secondCategory=?,foods=?,......
  • java.sql.SQLSyntaxErrorException
    YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'right)values('wdq','wdq......
  • XAMPP里tomcat启动报错:Make sure you have Java JDK or JRE installed and the requir
    ​​参考博客​​**1.运行命令行win+R在cmd中输入regedit出现下面的界面**2.在注册表中添加HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft/JavaDevelopmentKit3.成功界......
  • 基于Java springboot+mybatis+mysql+jsp网上书城管理系统
    @目录一、系统介绍二、功能展示1.主页(客户)2.登陆(客户)3.我的购物车(客户)4.我的订单(客户)5.我的图书(商家)6.新书上架(商家)7.订单管理(商家)7.统计分析(管理员)8.用户管理(用户管理......
  • Java 特性、三大版本、JDK、JRE、JVM
    Java的特性 简单性面向对象可移植性writeonce,runanywhere高性能分布式动态性通过反射机制多线程安全性异常机制健壮性 *思考?j......
  • JAVA数组
    JAVA数组定义数组是相同类型数据的有序集合声明创建dataType[]arrayRefVar=newdataType[arraySize];数组的声明是通过索引访问的获取数组长度:arrays.length......
  • 小白学JAVA第2天
    计算机computer组成Memory内存Motherboard主板IO设备输出设备inputonput人物冯·诺依曼“计算机之父”冯·诺依曼体系结构电脑常用的快捷键Num控制小键......
  • java.util.Optional基础
    传统处理Null方式深层质疑每次不确定一个变量是否为null时,添加一个进一步嵌套的if块,增加了代码缩进的层数。publicStringgetCarInsuranceName(Personperson){......
  • Java学习笔记2
    1.运算符和表达式运算符​ 就是对常量或者变量进行操作的符号。​ 如:+-*/表达式​ 用运算符把常量或者变量连接起来的,符合Java语法的式子就是表达式。​ 如:a+b......