あるクラスのフィールドの内容を、まったく別のクラスの同名のフィールドへコピーするメソッドです。
(同名フィールドは同じ型であることが必須)
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
public class MyClass {
public static void main(String... args) {
// コピー元のインスタンス生成
MemberA memA = new MemberA("Ichiro", "Tokyo", 25, "fishing", "ABC");
System.out.println(memA);
// 同名フィールドのコピーを実施
MemberB memB = new MemberB();
copyFields(memA, memB);
// コピー先のインスタンス表示
System.out.println(memB);
}
/**
* 別クラスの同名フィールドをコピーする
* @param source コピー元のインスタンス
* @param target コピー先のインスタンス
*/
private static void copyFields(Object source, Object target) {
final String prefixSet = "set";
final String prefixGet = "get";
Set<String> methodSet = new HashSet<String>();
for (Method method : target.getClass().getMethods())
if (method.getName().startsWith(prefixSet))
methodSet.add(method.getName().substring(prefixSet.length()));
try {
for (Method method : source.getClass().getMethods()) {
if (!method.getName().startsWith(prefixGet))
continue;
String curName = method.getName().substring(prefixGet.length());
if (methodSet.contains(curName)) {
Method newMethod = target.getClass().getMethod(prefixSet + curName, method.getReturnType());
newMethod.invoke(target, method.invoke(source));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
クラスMemberA
public class MemberA {
private String name;
private String address;
private Integer age;
private String hobby;
private String company;
public MemberA() {
}
// Eclipseでgetter/setter/toStringの生成、
// フィールドを使用してコンストラクタを生成
}
クラスMemberB
import java.time.LocalDate;
public class MemberB {
private String name;
private String school;
private String friendname;
private LocalDate birthday;
private Integer age;
private String address;
public MemberB() {
}
// Eclipseでgetter/setter/toStringの生成、
// フィールドを使用してコンストラクタを生成
}