eclipse
java
java反射可以获取对象成员变量的set/get方法,进行赋值和获取操作,这不正是我们想要的吗。来我们动手实践一下。
首先是set方法。set方法需要几个参数,set的字段名,set的对象,set的值。对象中成员变量可能是各种类型的。比如八大基本类型,List>,Map>等。所以通过反射的set方法比较麻烦。
第一部分:传入的参数有,字段名称,字段值,要赋值的对象。
第二部分:根据set的参数类型,进行不同的处理,如基本类型和String 类型。
第三部分:要考虑到泛型的集合
第四部分:根据Map的操作。
上面的Set方法,包括了Double,String,参数化类型集合,List>,Map
下面是get方法:相比于set来说,get方法就简单了很多,只需要字段名称和对象,就可以获取到字段的值。
至于怎么使用: Mirror.Mis('name',value,Object),Mirror.MiG('name',Object).附源码:
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