مواردی که کد تکراری زیاد است بهتر است از reflection استفاده شود، برای مورد شما می توانیم با generic متد ها و همچنین یک interface مشترک به نتیجه رسید:
public interface Exportable {
String export();
}
/////////////////////////////////////////////////////
public class AClass implements Exportable {
public String state;
public int num;
public AClass(String state, int num) {
this.state = state;
this.num = num;
}
@Override
public String export() {
return state+","+num;
}
}
/////////////////////////////////////////////////////
public static void main(String[] args) throws IOException {
List<AClass> list = new ArrayList<>();
list.add(new AClass("a", 1));
list.add(new AClass("b", 2));
list.add(new AClass("c", 3));
new Main().makeExcel(list);
}
public <T> void makeExcel(List<T> list){
for (T t: list){
if (t instanceof Exportable) {
System.out.println(((Exportable) t).export());
}
}
}
با استفاده از reflection هم متد makeExcel بصورت زیر در می آید:
public <T> void makeExcel(List<T> list) throws IllegalAccessException {
for (T t : list) {
StringBuilder sb = new StringBuilder();
sb.append(t.getClass().getName());
sb.append(": ");
for (Field f : t.getClass().getDeclaredFields()) {
sb.append(f.getName());
sb.append("=");
sb.append(f.get(t));
sb.append(", ");
}
System.out.println(sb.toString());
}
}