4 votes

Utiliser la réflexion pour compter les méthodes.

Je dois écrire une fonction

public static int[] countGettersandSetters (String classname)

pour compter le nombre de méthodes get et set et le retourner sous forme de tableau où l'indice 0 correspond aux sets et l'indice 1 aux gets.

Quelqu'un peut-il me donner une approche de haut niveau pour résoudre ce problème ?

10voto

Ravi Thapliyal Points 19305
public static int[] countGettersandSetters (String className)
    int[] count = new int[2];
    Method[] methods = Class.forName(className).getDeclaredMethods();
    for (Method method : methods) {
        if (method.getName().startsWith("set")) {
            count[0]++;
        } else if (method.getName().startsWith("get") ||
                   method.getName().startsWith("is")) { // to incl. boolean properties
            count[1]++;
        } 
    }
    return count;
}

Pour un tutoriel concis sur l'API de Reflection, jetez un coup d'oeil à aquí .

1voto

ChanceLai Points 68
public static int[] countGettersandSetters(String c) throws ClassNotFoundException {
    int[] count = new int[2];
    Class<?> classs = Class.forName(c);
    Field[] fields = classs.getDeclaredFields();
    for (Field field : fields) {
        String name = field.getName();
        try {
            classs.getMethod("set"+name.substring(0, 1).toUpperCase()+name.substring(1) , null);
            count[0]++;
        } catch (NoSuchMethodException e) {
        }
        try {
            classs.getMethod("get"+name.substring(0, 1).toUpperCase()+name.substring(1), field.getType());
            count[1]++;
        } catch (NoSuchMethodException e) {
        }
    }
    return count;
}

0voto

S.D. Points 12816

En tenant compte de la convention d'appellation standard, vérifiez qu'il existe une méthode avec "get" ou "set" préfixé au nom d'un champ de la classe :

public static int[] count(Class<? extends Object> c) {
    int[] counts = new int[2];

    Field[] fields = c.getDeclaredFields();
    Method[] methods = c.getDeclaredMethods();

    Set<String> fieldNames = new HashSet<String>();
    List<String> methodNames = new ArrayList<String>();

    for (Field f : fields){
        fieldNames.add(f.getName().toLowerCase());
    }

    for (Method m : methods){
        methodNames.add(m.getName().toLowerCase());
    }

    for (String name : methodNames){
        if(name.startsWith("get") && fieldNames.contains(name.substring(3))){
            counts[0]++;
        }else if(name.startsWith("set") && fieldNames.contains(name.substring(3))){
            counts[1]++;
        }
    }

    return counts;
}

Si vous voulez obtenir tous les getters/setters hérités également, remplacez getDeclaredFields() y getDeclaredMethods() con getFields() y getMethods() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X