2018年06月27日

別クラスの同名フィールドの内容をコピーする

あるクラスのフィールドの内容を、まったく別のクラスの同名のフィールドへコピーするメソッドです。
(同名フィールドは同じ型であることが必須)
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の生成、
// フィールドを使用してコンストラクタを生成
}
タグ:JAVA Eclipse
posted by Hiro at 23:19| Comment(0) | プログラム
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: