【问题标题】:how to get fields from a pojo dynamically如何动态地从 pojo 中获取字段
【发布时间】:2015-05-30 05:03:07
【问题描述】:

下面是我的 POJO 类,它有 50 个带有 setter 和 getter 的字段。

Class Employee{
int m1;
int m2;
int m3;
.
.
int m50;
//setters and getters

从我的另一堂课中,我需要获取所有这 50 个字段才能得到它们的总和

Employee e1 =new Emploee();
int total = e1.getM1()+e2.getM2()+........e2.getM50();

除了手动对 50 条记录执行此操作外,还有什么方法可以动态执行(通过任何循环)。

谢谢

【问题讨论】:

  • 只是好奇——为什么你会有 1000 个字段而不是列表?
  • 你可以使用java反射
  • 我认为反射远远超出了这个例子的范围。
  • 为什么你在一个类中甚至有 1000 个字段?所有这些数据真的如此相互关联,它们属于一起吗?
  • 不完全是 1000,只是为了一个想法,我给出了这个数字。如果它有 10 个字段,有什么办法吗?

标签: java variables field pojo


【解决方案1】:

你可以使用 java 反射。为简单起见,我假设您的 Employee calss 仅包含 int 字段。但是您可以使用此处使用的类似规则来获取floatdoublelong 值。这是一个完整的代码 -

import java.lang.reflect.Field;
import java.util.List;

class Employee{

    private int m=10;
    private int n=20;
    private int o=25;
    private int p=30;
    private int q=40;
}

public class EmployeeTest{

 public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException{

        int sum = 0;
        Employee employee = new Employee();
        Field[] allFields = employee.getClass().getDeclaredFields();

        for (Field each : allFields) {

            if(each.getType().toString().equals("int")){

                Field field = employee.getClass().getDeclaredField(each.getName());
                field.setAccessible(true);

                Object value = field.get(employee);
                Integer i = (Integer) value;
                sum = sum+i;
            }

        }

        System.out.println("Sum :" +sum);
 }

}

【讨论】:

  • 我认为他不知道如何使用数组,而反射绝对是现在我们希望他学习的东西,而不是数组或列表。
【解决方案2】:

我无法想象一个真实的生活场景,一个类中有 1000 个字段。话虽如此,您可以反思地调用所有吸气剂。使用 Introspector 完成此任务:

int getEmployeeSum(Employee employee)
{    
    int sum = 0;
    for(PropertyDescriptor propertyDescriptor : Introspector.getBeanInfo(Employee.class).getPropertyDescriptors())
    {
        sum += propertyDescriptor.getReadMethod().invoke(employee);
    }

    return sum;
}

【讨论】:

    【解决方案3】:

    是的,不要使用 1000 个字段!使用一个包含 1000 个元素的数组,然后用 mi 填充 array[i-1] 你的类会是这样的:

    Class Employee{
        int[] empArr = new int[1000];
    }
    

    然后使用可以找到这样的总和:

    int sum = 0;
    
    for(int i = 0; i<1000 ; i++)
        sum+= e1.empArr[i]
    

    【讨论】:

    • 谢谢你,但我正在从数据库中检索我的数据并存储在 pojo 中,所以我只需要使用我的 pojo 类
    • 那么你有一个包含 1000 列的表?
    【解决方案4】:

    是的,您可以像这样将它们放在一个数组中,而不是为每个 m1、m2、m3... 设置一个单独的变量:

    Class Employee {
        public int[] m = new int[1000];
    }
    
    Employee e1 = new Employee();
    int total = 0;
    
    for(int i = 0; i < e1.m.length; i++) {
        total += e1.m[i];
    }
    

    【讨论】:

    • 我只有字段,因为我使用的是 Spring Batch。
    猜你喜欢
    • 2016-10-23
    • 2016-01-05
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多