通过反射和自定义注解,实现对map的匹配(泛型)

自定义的注解


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface MapAnnotation {
}



@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD,ElementType.FIELD})
public @interface ListAnnotation {
}


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface SetDataAnnotation {

}



@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD,ElementType.FIELD})
public @interface GetKeyAnnotation {

}



使用
        package com.android.xjq.bean.coupon;

        import com.android.banana.commlib.bean.BaseOperator;
        import com.android.banana.commlib.utils.MethodUtils;
        import com.android.banana.commlib.utils.annotation.GetKeyAnnotation;
        import com.android.banana.commlib.utils.annotation.ListAnnotation;
        import com.android.banana.commlib.utils.annotation.MapAnnotation;
        import com.android.banana.commlib.utils.annotation.SetDataAnnotation;
        import com.google.gson.annotations.Expose;

        import java.util.List;
        import java.util.Map;

        import static android.R.attr.id;
        import static android.R.attr.targetId;
        import static com.tencent.qalsdk.base.a.be;
        import static com.tencent.qalsdk.sdk.MsfCommand.getKey;

/**
 * Created by zaozao on 2018/4/26.
 */
public class LianHongCoupon extends MethodUtils implements BaseOperator {


    private boolean jumpLogin;
    private String nowDate;
    private boolean success;

    @MapAnnotation
    private Map<String, BetCouponCountBean> betCouponMap;

    @ListAnnotation
    private List<BetCouponBean> packageSubTypeList;

    private boolean hasCoupon;

    public boolean isHasCoupon() {
        return hasCoupon;
    }

    public void setHasCoupon(boolean hasCoupon) {
        this.hasCoupon = hasCoupon;
    }

    public boolean isJumpLogin() {
        return jumpLogin;
    }

    public void setJumpLogin(boolean jumpLogin) {
        this.jumpLogin = jumpLogin;
    }

    public String getNowDate() {
        return nowDate;
    }

    public void setNowDate(String nowDate) {
        this.nowDate = nowDate;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }


    public List<BetCouponBean> getPackageSubTypeList() {
        return packageSubTypeList;
    }

    public void setPackageSubTypeList(List<BetCouponBean> packageSubTypeList) {
        this.packageSubTypeList = packageSubTypeList;
    }

    @Override
    public void operatorData() {

//        runFor(packageSubTypeList,"getId","setBetCouponCountBean",betCouponMap);
        runFor(this);
    }

    public static class BetCouponCountBean {
        /**
         * currentTotalCount : 1
         * subTypeCode : SIX_BET_COUPON
         * subTypeId : 4000980144123707840000002182
         * title : 6连红
         */
        private int currentTotalCount = 0;
        private String subTypeCode;
        private String subTypeId;
        private String title;

        public int getCurrentTotalCount() {
            return currentTotalCount;
        }


        public void setCurrentTotalCount(int currentTotalCount) {
            this.currentTotalCount = currentTotalCount;
        }

        public String getSubTypeCode() {
            return subTypeCode;
        }

        public void setSubTypeCode(String subTypeCode) {
            this.subTypeCode = subTypeCode;
        }

        public String getSubTypeId() {
            return subTypeId;
        }

        public void setSubTypeId(String subTypeId) {
            this.subTypeId = subTypeId;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }
    }

    public static class BetCouponBean {

        /**
         * code : EIGHT_BET_COUPON
         * enabled : true
         * gmtCreate : 2018-04-17 10:37:57
         * gmtModified : 2018-04-26 16:04:48
         * id : 4000980147070807840000002753
         * name : 8连红
         * typeId : 4000980111897607840000001701
         */

        private String code;
        private boolean enabled;
        private String gmtCreate;
        private String gmtModified;
        private String name;
        private String typeId;

        @GetKeyAnnotation
        private String id;

        @Expose @SetDataAnnotation
        private BetCouponCountBean betCouponCountBean;

        public BetCouponCountBean getBetCouponCountBean() {
            return betCouponCountBean;
        }

        public void setBetCouponCountBean(BetCouponCountBean betCouponCountBean) {
            this.betCouponCountBean = betCouponCountBean;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }

        public String getGmtCreate() {
            return gmtCreate;
        }

        public void setGmtCreate(String gmtCreate) {
            this.gmtCreate = gmtCreate;
        }

        public String getGmtModified() {
            return gmtModified;
        }

        public void setGmtModified(String gmtModified) {
            this.gmtModified = gmtModified;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getTypeId() {
            return typeId;
        }

        public void setTypeId(String typeId) {
            this.typeId = typeId;
        }
    }
}



通过注解,反射,将map里的数据匹配到list中去
        package com.android.banana.commlib.utils;

        import com.android.banana.commlib.utils.annotation.GetKeyAnnotation;
        import com.android.banana.commlib.utils.annotation.ListAnnotation;
        import com.android.banana.commlib.utils.annotation.MapAnnotation;
        import com.android.banana.commlib.utils.annotation.SetDataAnnotation;
        import com.android.library.Utils.LogUtils;

        import java.lang.annotation.Annotation;
        import java.lang.reflect.Field;
        import java.lang.reflect.InvocationTargetException;
        import java.lang.reflect.Method;
        import java.lang.reflect.ParameterizedType;
        import java.lang.reflect.Type;
        import java.util.List;
        import java.util.Map;


public class MethodUtils {

    /**
     *     Map<String, T2> map = new HashMap<>();
     for (int i = 0; i < 10; i++) {
     T1 t = new T1();
     t.setName("张" + i);
     t.setUserId(String.valueOf(i));

     T2 t2 = new T2();
     t2.title = "这是一个标题";

     if (i % 2 == 0) {
     t2.sex = "男";
     map.put(String.valueOf(i), t2);
     } else {
     t2.sex = "女";
     map.put(String.valueOf(i), t2);
     }

     list.add(t);
     }

     runFor(list, "getUserId", "setSex", map);
     *
     * @param list  服务端返回的List
     * @param getName  需要从当前的List去取相应的userId或者什么id的。
     * @param setName  需要将对象设置到list里面去
     * @param map  服务端返回的map
     */
    public static void runFor(List<?> list, String getName, String setName, Map<?, ?> map) {
        if(list==null||map==null)
            return;
        for (int i = 0; i < list.size(); i++) {
            Method[] declaredMethods = list.get(i).getClass().getDeclaredMethods();
            Object setObject = null;
            for (Method m : declaredMethods) {
                if (m.getName().equals(getName)) {
                    try {
                        Object invoke = m.invoke(list.get(i));
                        setObject = map.get(invoke);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }
            for (Method m : declaredMethods) {
                if (m.getName().equals(setName)) {
                    try {
                        if (setObject != null) {
                            m.invoke(list.get(i), setObject);
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }

        }
    }


    //我写的
    public static void runFor(Object o) {
        Class clazz = o.getClass();

        Field[] fields = clazz.getDeclaredFields();

        Map<?,?> map = null;

        List<?> list = null;

        String setData = "";

        String getKey ="";

        for(Field field :fields){
            field.setAccessible(true);
            if(field.isAnnotationPresent(MapAnnotation.class)){
                //得到map字段名
                MapAnnotation mapAnnotation = (MapAnnotation) field.getAnnotation(MapAnnotation.class);
                try {

                    map = ( Map<?,?>) field.get(o);

                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }

            }
            else if(field.isAnnotationPresent(ListAnnotation.class)){
                //得到list字段名
                ListAnnotation listAnnotation= (ListAnnotation) field.getAnnotation(ListAnnotation.class);

                try {
                    list = (List<?>) field.get(o);

                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if(list!=null){
                    Type type = field.getGenericType();

                    if (type  instanceof ParameterizedType)  //【3】如果是泛型参数的类型
                    {
                        ParameterizedType pt =(ParameterizedType)type;

                        Class genericClazz = (Class) pt.getActualTypeArguments()[0];//【4】得到泛型里的类类型对象。

                        Field[] subFields = genericClazz.getDeclaredFields();

                        for(Field subFiled :subFields){

                            subFiled.setAccessible(true);

                            if(subFiled.isAnnotationPresent(SetDataAnnotation.class)){
                                setData = "set"+subFiled.getName().substring(0,1).toUpperCase()+subFiled.getName().substring(1);
                            }
                            if(subFiled.isAnnotationPresent(GetKeyAnnotation.class)){
                                getKey = "get"+subFiled.getName().substring(0,1).toUpperCase()+subFiled.getName().substring(1);
                            }
                        }

                    }

                }
            }
        }

        if(list==null||map==null)
            return;

        for (int i = 0; i < list.size(); i++) {
            Method[] declaredMethods = list.get(i).getClass().getDeclaredMethods();
            Object setObject = null;
            for (Method m : declaredMethods) {
                if (m.getName().equals(getKey)) {
                    try {
                        Object invoke = m.invoke(list.get(i));
                        setObject = map.get(invoke);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }
            for (Method m : declaredMethods) {
                if (m.getName().equals(setData)) {
                    try {
                        if (setObject != null) {
                            m.invoke(list.get(i), setObject);
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }

        }

    }

}

猜你喜欢

转载自blog.csdn.net/briup_qiuqiu/article/details/80855026