自定义的注解 @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(); } } } } }
}