関数を書く必要があります
public static int[] countGettersandSetters (String classname)
get および set メソッドの数をカウントし、インデックス 0 がセットでインデックス 1 が取得される配列として返します。
この問題を解決する方法について、高レベルのアプローチを教えてくれる人はいますか?
関数を書く必要があります
public static int[] countGettersandSetters (String classname)
get および set メソッドの数をカウントし、インデックス 0 がセットでインデックス 1 が取得される配列として返します。
この問題を解決する方法について、高レベルのアプローチを教えてくれる人はいますか?
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 の簡潔なチュートリアルについては、こちらをご覧ください。
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;
}
標準の命名規則を考慮して、クラスのフィールド名の前に「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()
ます。