利用java 反射原理写了一个赋值和取值通用类

原创 2012年03月22日 10:47:14

      首先了解一下反射的原理,什么是反射?所谓的反射就是指java 语言在运行时拥有一项自观的能力,反射能使你得到装载到 jvm 中的类的内部信息,它不需要你在编码的时候就知道所需类的内部信息,允许程序执行时才得到所需类的内部信息。反射能够构建灵活的应用的程序。 

      使用反射为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反射无所不能,辣么,怎么通过反射设置一个属性的值呢? 主程序:/** * @author tengqingya * @create 2017-03-05 15:54 */ public...

java高级编程-使用反射强制给private字段赋值

今天项目中遇到了一个问题,要调用一个类,并获取这个类的属性进行赋值然后将这个类传递到方法中做为参数。 实际操作时才发现,这个类中的字段属性是私有的,不能进行赋值!没有提供公有的方法。而这个类又是打包...
  • yaerfeng
  • yaerfeng
  • 2011年12月26日 16:22
  • 20796

java反射给实体类赋值

给实体类赋值有两种方法,一个是通过Field.set()方法,另一个是Method.invoke(); 至于两种方法的区别,还想请教: 我知道的:set直接给属性赋值,invoke通过调用属性的s...

java 利用反射机制,获取实体所有属性和方法,并对属性赋值

原地址:http://www.cnblogs.com/zhouyalei/archive/2013/09/12/java-reflect.html 一个普通的实体Person: pri...

java 反射给字段重新赋值

1.获取实体的所有字段,遍历 2.获取字段类型 3.调用字段的get方法,判断字段值是否为空 4.如果字段值为空,调用字段的set方法,为字段赋值 Field[] field = mo...

Java反射得到属性的值和设置属性的值

package com.whbs.bean; public class UserBean { private Integer id; private int age; ...

java反射遍历实体类属性和类型,并赋值和获取值

import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang...

java反射获取字段以及获取字段值和设置字段值

字段的获取与前面构造方法和行为方法差不多;思路一样 package javaInvokeFiled; import java.lang.reflect.Field; /**  * 反射获取字...

通过java反射机制获取该类的所有属性类型、值、

方法使用了这俩个包下的 field 和method import java.lang.reflect.Field; import java.lang.reflect.Method; pu...

Java反射 - 简单的给Bean赋值和取值

利用java反射原理,写了一个简单给bean赋值和取值通用的类,能动态的给类或对象添加属性,也能动态获取类和对象的属性值...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用java 反射原理写了一个赋值和取值通用类
举报原因:
原因补充:

(最多只允许输入30个字)