多语言展示
当前在线:1605今日阅读:27今日分享:41

如何借助java反射简化我们的繁重的工作

作为一名开发人员,get/set方法想必都知道,那么当我们面对大量的字段需要进行赋值获取的时候,你是否因为繁多的英文名而烦恼。因为成员变量名和set/get方法间还是有一个差距的,无法一眼看出来,这个set/get获取的是哪个字段。
工具/原料
1

eclipse

2

java

方法/步骤
1

java反射可以获取对象成员变量的set/get方法,进行赋值和获取操作,这不正是我们想要的吗。来我们动手实践一下。

2

首先是set方法。set方法需要几个参数,set的字段名,set的对象,set的值。对象中成员变量可能是各种类型的。比如八大基本类型,List,Map等。所以通过反射的set方法比较麻烦。

3

第一部分:传入的参数有,字段名称,字段值,要赋值的对象。

4

第二部分:根据set的参数类型,进行不同的处理,如基本类型和String 类型。

5

第三部分:要考虑到泛型的集合

6

第四部分:根据Map的操作。

7

上面的Set方法,包括了Double,String,参数化类型集合,List,Map的操作,如果不满足你的需要,你可以自定义类型去进行操作。

8

下面是get方法:相比于set来说,get方法就简单了很多,只需要字段名称和对象,就可以获取到字段的值。

9

至于怎么使用: Mirror.Mis('name',value,Object),Mirror.MiG('name',Object).附源码:

10

import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.math.BigDecimal;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;public class Mirror { public static void miS(String name, Object value, Object ob) { try { PropertyDescriptor pd = new PropertyDescriptor(name, ob.getClass()); Method wM = pd.getWriteMethod(); Class parameterType = wM.getParameterTypes()[0]; if (parameterType == String.class) { wM.invoke(ob, String.valueOf(value)); } else if (parameterType == int.class || parameterType == Integer.class) { wM.invoke(ob, new BigDecimal(String.valueOf(value)).intValue()); } else if (parameterType == double.class || parameterType == Double.class) { wM.invoke(ob, new BigDecimal(String.valueOf(value)).doubleValue()); } else if (parameterType.isArray()) { Object[] list = null; if (value instanceof List) { list = ((List) value).toArray(); } else { list = (Object[]) value; } Object[] args = new Object[list.length]; for (int index = 0; index < list.length; index++) { Object item = list[index]; if (item instanceof Number) { args[index] = item; } else if (item instanceof String) { args[index] = item; } else { args[index] = item; } } wM.invoke(ob, args); } else { Type[] parameters = wM.getGenericParameterTypes(); if (parameters.length > 0) { if (parameters[0] instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) parameters[0]; Type[] actualTypeArguments = pt .getActualTypeArguments(); if (actualTypeArguments.length == 1) { List args = new ArrayList(); Object[] list = null; if (value instanceof List) { list = ((List) value).toArray(); } else { list = (Object[]) value; } for (Object item : list) { if (item instanceof Number) { args.add(item); } else if (item instanceof String) { args.add(item); } else { args.add(item); } } wM.invoke(ob, args); } else if (actualTypeArguments.length == 2) { Map targetMp = (Map) value; Map args = new HashMap(); for (Object key : targetMp.keySet()) { Object val = targetMp.get(key); if (val instanceof Number) { args.put(key, val); } else if (val instanceof String) { args.put(key, val); } else { args.put(key, val); } } wM.invoke(ob, args); } } } } } catch (Exception e) { e.printStackTrace(); } } public static Object miG(String name, Object o) { Object e = null; try { Class cls = o.getClass(); PropertyDescriptor p = new PropertyDescriptor(name, cls); Method rm = p.getReadMethod(); e = rm.invoke(o); } catch (Exception ex) { ex.printStackTrace(); } return e; } public static void miT(Object orgin,Object result,Map map){ Iterator> it = map.entrySet().iterator(); while(it.hasNext()){ Entry entry = it.next(); String to = entry.getKey(); String tr = entry.getValue(); Object value  = miG(to, orgin); miS(tr, value, result); } }}