2015-05-30 4 views
2

Ниже мой класс POJO, который имеет 50 полей с сеттерами и геттерами.Как получить поля из pojo динамически

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 записей, есть ли способ сделать это динамически (с помощью любого цикла).

Благодаря

+3

Просто любопытно - почему у вас было бы 1000 полей вместо списка? – dnault

+1

Вы можете использовать отражение java – Razib

+0

Я думаю, что отражение далеко выходит за рамки этого примера. –

ответ

4

Вы можете использовать Java отражение. Для простоты я предполагаю, что ваши Employee calss содержат только поле int. Но вы можете использовать аналогичные правила, используемые здесь для получения float, double или long. Вот полный код:

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

} 
+0

Я думаю, что он не знает, как использовать массив, и отражение, безусловно, теперь то, что мы хотим, чтобы он учился вместо массивов или списков. –

1

Да, вместо того, чтобы иметь отдельную переменную для каждого 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]; 
} 
+0

У меня есть только поля, потому что я использую весеннюю партию. – User111

2

Да, не использовать 1000 поля! использовать массив с 1000 элементов, а затем заполнить array[i-1] с mi ваш класс будет что-то вроде:

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

тогда использование может найти сумму так:

int sum = 0; 

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

Thnk вы, но я возвращаю данные из базы данных и сохраняю в pojo, поэтому мне нужно использовать только класс pojo – User111

+0

Итак, у вас есть таблица с 1000 столбцами? – Ouney

3

Я не могу представить себе реальную жизнь где у вас будет 1000 полей в классе. Сказав это, вы можете вскрыть все ваши геттеры. Используйте Introspector для выполнения этой задачи:

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

    return sum; 
} 
Смежные вопросы