Reflexion para contar valores en un datatable

Algunas ocasiones tenemos que contar una cantidad valores en los atributos, generalmente tendríamos que hacerlo propiedad por propiedad.

Contamos con un Entity

necesitaríamos un código como donde veríamos múltiples condiciones y tenemos que usar cada atributo mediante el método get, en este ejemplo serian 31 campos. Imaginemos el escenario que sea una cantidad mayor, tendríamos un segmento de código mas o menos como el que mostramos aquí.

for (Agente a : agenteList) {
                t1 = 0;
                t2 = 0;
                t3 = 0;
                t4 = 0;
for (Reservadoagente r : reservadoagenteList) {
if(r.getTurno1() == 1 || r.getTurno2() == 1 || r.getTurno3() == 1 || r.getTurno4() ==1 ,,, r.getTurno31()==1 ){
t1++;
}
else{
    if(r.getTurno1() == 2 || r.getTurno2() == 2 || r.getTurno3() == 2 || r.getTurno4() ==2 ,,,       
        r.getTurno31()==2 ){
        t2++;

   }
else{
    if(r.getTurno1() == 3 || r.getTurno2() == 3 || r.getTurno3() == 3 || r.getTurno4() ==3 ,,,       
        r.getTurno31()==3){
        t3++;

   }else{
 if(r.getTurno1() == 4 || r.getTurno2() == 4 || r.getTurno3() == 4 || r.getTurno4() ==4 ,,,       
        r.getTurno31()==4){
        t2++;

   }
 }

}
...

Para evitar todo esto podemos usar el API reflexión.

Simplemente invocamos los métodos get de los atributos Turnodia, y comparamos el resultado para determinar si es un 1, 2, 3, 4. Y con esto tendremos un contador de cada valor,.

 private void totalizarTurnosAgente() {
        try {
            Integer t1 = 0;
            Integer t2 = 0;
            Integer t3 = 0;
            Integer t4 = 0;
            Integer row = -1;
            Integer horasmes = 0;
            for (Agente a : agenteList) {
                t1 = 0;
                t2 = 0;
                t3 = 0;
                t4 = 0;
                row++;
                Class noparams[] = {};
                for (Reservadoagente r : reservadoagenteList) {

                    if (r.getAgente().getCedula().equals(a.getCedula())) {
                        Class cls = r.getClass();
                        Object obj = r;
                        for (Method method : Reservadoagente.class.getDeclaredMethods()) {
                            if (method.getName().contains("getTurnodia")) {
                                String name = method.getName();
                                Method methodrun = cls.getDeclaredMethod(name, noparams);
                                Object result = methodrun.invoke(obj, null);
                                switch (Integer.parseInt(result.toString().trim())) {
                                    case 0:
                                        break;
                                    case 1:
                                        t1++;
                                        break;
                                    case 2:
                                        t2++;
                                        break;
                                    case 3:
                                        t3++;
                                        break;
                                    case 4:
                                        t4++;
                                        break;
                                    default:

                                }
                            }
                        }
                    }
                }
                reservadoagenteList.get(row).setT1(t1);
                reservadoagenteList.get(row).setT2(t2);
                reservadoagenteList.get(row).setT3(t3);
                reservadoagenteList.get(row).setT4(t4);
                horasmes = (t1 * 8) + (t2 * 8) + (t3 * 8) + (t4 * 6);
                reservadoagenteList.get(row).setHorasmes(horasmes);

            }
        } catch (Exception e) {
            JsfUtil.errorMessage("totalizarTurnosAgente() " + e.getLocalizedMessage());
        }

    }

Last updated

Was this helpful?