Skip to main content

Contador mediante Reflexión

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 implementar un código 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,.
        Class noparams[] = {};
                for (Reservadoagente r : reservadoagenteList) {

                        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:

                                }
                            }
                        }
                    }
                }


Tendríamos una representación gráfica de la siguiente manera.


Comments

Anonymous said…
I am truly glad to glance at this website posts which contains tons of useful information, thanks for providing such information.
Anonymous said…
I am sure this paragraph has touched all the internet visitors,
its really really good paragraph on building up new weblog.