假定用用场景:从web前端把数据打包为Map<String,String>的方式传到后台,并告诉domain的类名,后台根据这些信息创建domain实例并给这些属性赋值。下面是实现的代码:
第一步:创建domain类 Person.java,注意此处重载了toString()方法
package com.xiaofan.demo.reflect; public class Person { private int id; private String name ; private int age; private float salary ; private String address ; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("{ ") .append("id:").append(id).append(", ") .append("name:").append(name).append(", ") .append("age:").append(age).append(", ") .append("salary:").append(salary).append(", ") .append("address:").append(address) .append(" }"); return sb.toString(); } }
第二步,创建解析类CommandUtil.java,它是核心处理类
package com.xiaofan.demo.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; /** * * 本CommandUtil简单的处理基本类型的域,并假定传值的map为<String, String>方式; * * @author Administrator * */ public class CommandUtil { /** * 根据requestMap创建对应的类实例并更新实例中的域 * @param requestMap * @param commandClass * @return * @throws ClassNotFoundException * @throws InstantiationException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ public static Object getCommand( Map requestMap, String commandClass ) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ Class clazz = Class.forName( commandClass ); Object obj = clazz.newInstance(); return updateCommand( requestMap, obj); } /** * 用requestMap中的值来更新command中的public同名set域 * @param requestMap * @param command * @return * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InvocationTargetException */ public static Object updateCommand( Map requestMap, Object command ) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{ Method[] methods = command.getClass().getMethods(); for( int i=0; i<methods.length; i++ ){ if( methods[i].getName().startsWith("set") ){ String fieldName = methods[i].getName().substring(3); String firstChar = fieldName.substring(0, 1); fieldName = firstChar.toLowerCase() + fieldName.substring(1); if( requestMap.containsKey( fieldName )){ String param = (String)requestMap.get( fieldName ); Object[] values = findOutParamValues( param, methods[i] ); methods[i].invoke( command, values ); } } } return command ; } /** * Set方法,只有一个参数,此处只简单处理基本数据类型 * * @param param * @param method * @return */ private static Object[] findOutParamValues( String param, Method method ){ Class[] params = method.getParameterTypes(); Object[] objs = new Object[ params.length ]; for( int i=0; i<params.length; i++ ){ if( params[i] == String.class ){ objs[i] = param ; } else if( params[i] == Short.TYPE ){ short num = Short.parseShort( param ); objs[i] = num ; } else if( params[i] == Integer.TYPE ){ int num = Integer.parseInt( param ); objs[i] = num ; } else if( params[i] == Long.TYPE ){ long num = Long.parseLong( param ); objs[i] = num ; } else if( params[i] == Float.TYPE ){ float num = Float.parseFloat( param ); objs[i] = num; } else if( params[i] == Double.TYPE ){ double num = Double.parseDouble( param ); objs[i] = num; } else if( params[i] == Boolean.TYPE ){ boolean num = Boolean.parseBoolean( param ); objs[i] = num; } } return objs; } }
第三步,应用实例 CommandUtilDemo.java
package com.xiaofan.demo.reflect; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; public class CommandUtilDemo { public static void main(String[] args) { Map map = new HashMap(); map.put("id", "2"); map.put("name", "Jack Rolling"); try { Person p = (Person)CommandUtil.getCommand(map, "com.xiaofan.demo.reflect.Person"); System.out.println( p ); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
输出结果如下: