リフレクションを通じてクラスの属性と属性値を動的に取得し、あるクラスの対応する属性値を別のクラスに割り当てます

あまり意味がないので、コードメソッドに直接移動します。このメソッドは、汎用タイプの任意のタイプTのコレクションを渡し、リフレクションを使用してコレクションからタイプTのオブジェクトのプロパティを取得し、タイプEのオブジェクトに設定してオブジェクトを返します。 E。親愛なる友人、あなたは私が書いたこの方法を使ってあなたのニーズに合ったどんな変容もすることができます。

/**
 *
 * @param from
 * @param e
 * @param <T>  传入的对象
 * @param <E>  输出的对象
 * @return  把集合为T的 类型通过反射,进行对应的赋值到e的相同属性中去
 * @throws IllegalAccessException
 * @throws InstantiationException
 * @throws ClassNotFoundException
 * @throws NoSuchFieldException
 */
public <T, E> E getArrObjByNames(ArrayList<T> from, E e) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchFieldException {
    // 被赋值对象
    List<Field> fields = Arrays.asList(e.getClass().getDeclaredFields());
    List<String> list = new ArrayList<>();
    fields.forEach(field -> list.add(field.getName()));
    for (T t : from) {
        System.out.println(t);
        for (int i = 0; i < t.getClass().getDeclaredFields().length; i++) {
            String str = t.getClass().getDeclaredFields()[i].getName();
            // 因为FIELDNUM 是静态的 注意getDeclaredField 和 getField 的不同
            if (!"FIELDNUM".equals(str) && list.contains(str)) {
                Field f = e.getClass().getDeclaredField(str);
                // 
                Field f1 = t.getClass().getDeclaredField(str);
                f.setAccessible(true);
                f1.setAccessible(true);
                f.set(e, f1.get(t));
            }
        }
    }
    return e;
}

上記のFieldクラスのgetメソッドに注意してください。f.get(obj)で渡すのは、フィールドが配置されているobjオブジェクトです。

おすすめ

転載: blog.csdn.net/AntdonYu/article/details/105450902