利用java 反射原理写了一个赋值和取值通用类
2012-03-22 10:47
393 查看
首先了解一下反射的原理,什么是反射?所谓的反射就是指java 语言在运行时拥有一项自观的能力,反射能使你得到装载到 jvm 中的类的内部信息,它不需要你在编码的时候就知道所需类的内部信息,允许程序执行时才得到所需类的内部信息。反射能够构建灵活的应用的程序。
使用反射为bean 赋值 ,主要表现在几点,一:利用反射查找出bean类所有public方法,类定义的属性。二:如果是赋值,必须先判断属性类型,再逐个赋值,
三:调用method 类的invoke方法访问bean 的set 、get 方法设值、取值。
看下面代码:
使用反射为bean 赋值 ,主要表现在几点,一:利用反射查找出bean类所有public方法,类定义的属性。二:如果是赋值,必须先判断属性类型,再逐个赋值,
三:调用method 类的invoke方法访问bean 的set 、get 方法设值、取值。
看下面代码:
package com.reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; public class ReflectGetValue { /** * 取出bean 属性和值 * @param obj * @return * @throws Exception */ public static Map<Object,Object> getFileValue(Object obj) throws Exception{ Map<Object, Object> map = new HashMap<Object, Object>(); Class<?> cls = obj.getClass(); Method methods[] = cls.getDeclaredMethods(); Field fields[] = cls.getDeclaredFields(); for(Field field:fields){ String fldtype = field.getType().getSimpleName(); String getMetName = pareGetName(field.getName()); String result =""; if(!checkMethod(methods,getMetName)){ continue; } Method method = cls.getMethod(getMetName, null); Object object = method.invoke(obj, new Object[]{}); if(null != object){ if(fldtype.equals("Date")){ result = fmlDate((Date)object); } result = String.valueOf(object); } map.put(field.getName(), result); } return map; } /** * 设置bean 属性值 * @param map * @param bean * @throws Exception */ public static void setFieldValue(Map<Object, Object> map, Object bean) throws Exception{ Class<?> cls = bean.getClass(); Method methods[] = cls.getDeclaredMethods(); Field fields[] = cls.getDeclaredFields(); for(Field field:fields){ String fldtype = field.getType().getSimpleName(); String fldSetName = field.getName(); String setMethod = pareSetName(fldSetName); if(!checkMethod(methods, setMethod)){ continue; } Object value = map.get(fldSetName); System.out.println(value.toString()); Method method = cls.getMethod(setMethod, field.getType()); System.out.println(method.getName()); if(null != value){ if("String".equals(fldtype)){ method.invoke(bean, (String)value); }else if("Double".equals(fldtype)){ method.invoke(bean, (Double)value); }else if("int".equals(fldtype)){ int val = Integer.valueOf((String)value); method.invoke(bean, val); } } } } /** * 拼接某属性get 方法 * @param fldname * @return */ public static String pareGetName(String fldname){ if(null == fldname || "".equals(fldname)){ return null; } String pro = "get"+fldname.substring(0,1).toUpperCase()+fldname.substring(1); return pro; } /** * 拼接某属性set 方法 * @param fldname * @return */ public static String pareSetName(String fldname){ if(null == fldname || "".equals(fldname)){ return null; } String pro = "set"+fldname.substring(0,1).toUpperCase()+fldname.substring(1); return pro; } /** * 判断该方法是否存在 * @param methods * @param met * @return */ public static boolean checkMethod(Method methods[],String met){ if(null != methods ){ for(Method method:methods){ if(met.equals(method.getName())){ return true; } } } return false; } /** * 把date 类转换成string * @param date * @return */ public static String fmlDate(Date date){ if(null != date){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.US); return sdf.format(date); } return null; } } ----------------------------------
测试方法 public static void main(String[] args) { try { Map<Object, Object> map = new HashMap<Object, Object>(); map.put("yi", "michael"); map.put("san", "27"); map.put("er", "2010-10-24"); Bean bean = new Bean(); ReflectGetValue.setFieldValue(map, bean); Map<Object, Object> m= ReflectGetValue.getFileValue(bean); System.out.println(m.toString()); } catch (Exception e) { e.printStackTrace(); } }
相关文章推荐
- 利用java反射原理写了一个简单赋值和取值通用类【改】
- java 反射原理写了一个赋值和取值通用类
- 利用JAVA的动态属性之反射原理实现一个简单AOP容器 - AOP的实现原理分析
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- 利用java的反射原理实现数据注入功能
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用java的反射原理实现数据注入功能
- 利用反射java对象赋值,省略重复get,set赋值.
- 利用java反射实现两个具有相同属性bean赋值
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- 利用反射完成一个类中,属性的批量赋值操作
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- 模拟spring aop (利用java反射原理)
- 利用Java的反射机制解析一个Class对象的详细内容(工具方法留用)
- 野人学Android第三弹——利用java的反射机制创建一个数据操作类
- 利用JAVA反射技术查找一个类的所有属性
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)