反射应用实例--根据map中的值创建对应并调用set方法给域赋值

来源:互联网 发布:python getattr 编辑:程序博客网 时间:2024/05/17 05:55

假定用用场景:从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();        }    }}

输出结果如下:

image

0 0
原创粉丝点击