先日の オブジェクト間フィールドのコピー - Oboe吹きプログラマの黙示録
を修正することにした。
それは、継承クラスにおいて継承元のフィールドをコピーすることを考慮すべきだからだ。
@Data @EqualsAndHashCode(callSuper=true)
を書いているときのエンティティとかで継承元のフィールドをコピーするできるようにする。
FieldCopy
import java.io.Serializable; import java.lang.reflect.Field; import java.util.function.Consumer; /** * FieldCopy. 指定属性フィールドのコピー */ @FunctionalInterface public interface FieldCopy<T> extends Serializable{ String get(T t) throws Exception; /** * フィールドコピー実行Consumerの生成 * @param function コピー対象フィールド名を返す関数型インターフェース FieldCopy * @param t コピー先Object * @return コピー元を指定する Consumer */ public static <T> Consumer<T> of(FieldCopy<T> function, T t){ return u->{ try{ String fname = function.get(t); Field f = null; Class<?> cls = t.getClass(); while(cls != null){ try{ f = cls.getDeclaredField(fname); break; }catch(NoSuchFieldException e){ cls = cls.getSuperclass(); } } f.setAccessible(true); f.set(u, f.get(t)); }catch(Throwable ex){ throw new RuntimeException(ex); } }; } }
FieldArrayCopy
import java.io.Serializable; import java.lang.reflect.Field; import java.util.function.Consumer; /** * FieldArrayCopy. 指定属性(配列)フィールドのコピー */ @FunctionalInterface public interface FieldArrayCopy<T> extends { String[] get(T t) throws Exception; /** * フィールドコピー実行Consumerの生成 * @param function コピー対象フィールド名の配列を返す関数型インターフェース FieldArrayCopy * @param t コピー先Object * @return コピー元を指定する Consumer */ public static <T> Consumer<T> of(FieldArrayCopy<T> function, T t){ return u->{ try{ for(String fname:function.get(t)){ Field f = null; Class<?> cls = t.getClass(); while(cls != null){ try{ f = cls.getDeclaredField(fname); break; }catch(NoSuchFieldException e){ cls = cls.getSuperclass(); } } f.setAccessible(true); f.set(u, f.get(t)); } }catch(Throwable ex){ throw new RuntimeException(ex); } }; } }
FieldListCopy
import java.lang.reflect.Field; import java.util.List; import java.util.function.Consumer; /** * FieldListCopy. 指定属性(リスト)フィールドのコピー */ @FunctionalInterface public interface FieldListCopy<T>{ List<String> get(T t) throws Exception; /** * フィールドコピー実行Consumerの生成 * @param function コピー対象フィールド名のリストを返す関数型インターフェース FieldListCopy * @param t コピー先Object * @return コピー元を指定する Consumer */ public static <T> Consumer<T> of(FieldListCopy<T> function, T t){ return u->{ try{ for(String fname:function.get(t)){ Field f = null; Class<?> cls = t.getClass(); while(cls != null){ try{ f = cls.getDeclaredField(fname); break; }catch(NoSuchFieldException e){ cls = cls.getSuperclass(); } } f.setAccessible(true); f.set(u, f.get(t)); } }catch(Throwable ex){ throw new RuntimeException(ex); } }; } }
よって、こちらも修正を入れて、Version 4.34 にした。
https://github.com/yipuran/yipuran-core