4

関数を書く必要があります

public static int[] countGettersandSetters (String classname)

get および set メソッドの数をカウントし、インデックス 0 がセットでインデックス 1 が取得される配列として返します。

この問題を解決する方法について、高レベルのアプローチを教えてくれる人はいますか?

4

3 に答える 3

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

Reflection API の簡潔なチュートリアルについては、こちらをご覧ください。

于 2013-08-05T03:24:46.603 に答える
1
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;
}
于 2013-08-05T03:52:25.753 に答える
0

標準の命名規則を考慮して、クラスのフィールド名の前に「get」または「set」が付いたメソッドが存在することを確認します。

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

継承されたすべてのゲッター/セッターも取得する場合は、getDeclaredFields()andgetDeclaredMethods()getFields()andに置き換えgetMethods()ます。

于 2013-08-05T03:33:24.637 に答える