反射应用实例--根据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(); } }}
输出结果如下:
0 0
- 反射应用实例--根据map中的值创建对应并调用set方法给域赋值
- Java如何根据类名和方法名创建类的实例,并调用对应方法?
- MYSQL 创建用户并给用户赋值对应数据库权限
- 反射给没有set方法的属性赋值
- 如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??
- 如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??
- 使用<jsp:setProperty创建javaBeans并给创建实例赋值
- java反射:根据给定类名实例化类并调用其方法
- Android反射出一个类中的其他类对象并调用其对应方法
- Android反射出一个类中的其他类对象并调用其对应方法
- 反射:动态读取XML创建类实例并赋值
- Java反射代码--07.根据字段调用所有set方法
- Java 动态的创建注入代码,注入方法给类或者接口并通过反射调用
- 反射机制进行动态调用的两种创建方法实例与hama中的反射机制
- java 反射 根据字符串给字段赋值
- java中Property类配置文件,反射创建实例并调用这个类的方法
- 通过反射技术创建窗体实例然后给控件赋值(C#)
- java反射获取类实例并调用私有方法
- svn常用命令
- android provider 中关于Cursor的一个问题
- Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
- 软考进行时——伪代码中的约定
- PowerShell学习入门 - 5 (文件压缩与解压缩)
- 反射应用实例--根据map中的值创建对应并调用set方法给域赋值
- contentOffset,contentInset属性含义u
- AOI设备带动机器视觉行业快速发展
- Java、Android编程技巧
- ArrayList
- Linux shell拾遗
- 经常反复 调用的代码
- Leetcode: SingleNumber I
- VC 让进程/网页静音的方法