使用反射循环获取Bean中的属性

Posted ghq120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用反射循环获取Bean中的属性相关的知识,希望对你有一定的参考价值。

平时在做项目的时候,会遇到一些比较奇葩的Bean,比如好多重复的只是序号不同的属性,例如:imgPath1,imgPath2,.....imgPath10。甚至更多(再多就是设计的问题了,对于维护的系统当然也不会去重新设计Bean,只能在有限的范围内进行优化)对于这样的属性获取时因为get方法不同看起来不能循环操作,实际上是可以使用循环的。

对象Bean

列出5个属性作为参考,省略了get和Set方法

public class ForBean {
    
    private String imgPath1 = null;
    
    private String imgPath2 = null;
    
    private String imgPath3 = null;
    
    private String imgPath4 = null;
    
    private String imgPath5 = null;

}

不推荐的写法

大多数人遇到这样的Bean时会用一下的方法写,要是属性有10个,20个,那就得重复多次。虽然不会有问题,但是显得很不优雅。

public static void main(String[] args) {
    
    ForBean forBean = new ForBean();
    
    forBean.setImgPath1("path1");
    forBean.setImgPath2("path2");
    forBean.setImgPath3("path3");
    forBean.setImgPath4("path4");
    forBean.setImgPath5("path5");
    
    Map<String,String> map = new HashMap<String,String>();
    map.put("imgPath1", forBean.getImgPath1());
    map.put("imgPath2", forBean.getImgPath2());
    map.put("imgPath3", forBean.getImgPath3());
    map.put("imgPath4", forBean.getImgPath4());
    map.put("imgPath5", forBean.getImgPath5());

    System.out.println(map.toString());

}

以上代码输出的结果如下

{imgPath2=path2, imgPath3=path3, imgPath1=path1, imgPath4=path4, imgPath5=path5}

使用反射循环获取

public static void main(String[] args) {
    
    ForBean forBean = new ForBean();
    
    forBean.setImgPath1("path1");
    forBean.setImgPath2("path2");
    forBean.setImgPath3("path3");
    forBean.setImgPath4("path4");
    forBean.setImgPath5("path5");
                
    Map<String,String> map2 = new HashMap<String,String>();
    try {
        Class clazz = Class.forName("ForBean");
        for(int i=1; i <= 5; i++) {
            Method method = clazz.getMethod("getImgPath"+i);
            String path = (String)method.invoke(forBean);
            map2.put("imgPath"+i, path);
        }
        
    } catch (Exception e) {
        e.printStackTrace();
    }
        
    System.out.println(map2.toString());

}

当然使用反射后的方法输出的结果如下,和之前的结果是一样的。虽然这样的一个改动也没有说很厉害,只是觉得代码大家都会写,不光要是会写,主要目标还是写好,这就要平时多思考多积累。

{imgPath2=path2, imgPath3=path3, imgPath1=path1, imgPath4=path4, imgPath5=path5}

反射知识

想回顾反射的知识可以参考我之前写的博客
反射获取一个类的私有方法
https://www.cnblogs.com/ghq120/p/8439204.html

以上是关于使用反射循环获取Bean中的属性的主要内容,如果未能解决你的问题,请参考以下文章

反射获取对象的属性值

反射-Spring管理Bean,注入Bean属性的反射机制。

使用反射对bean的collection属性赋值

反射相关类

java使用反射比较两个bean对象属性值是否相等

java 通过反射怎么获取方法中参数值