【修正】オブジェクト間フィールドのコピー

先日の オブジェクト間フィールドのコピー - 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