JAVA通过反射加载/设置类型属性

JAVA通过反射加载/设置类型属性

定义

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
—— [ JAVA反射机制-百度百科 ]

代码块

package com.aol.personalassistant.util;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.util.CollectionUtils;

import com.aol.personalassistant.base.SuperEntity;



/**
 * 反射加载类
 */
public class ReflectUtil {

    /**
     * 获取类型
     * @param clazz
     * @param index
     * @return
     * @throws Exception
     */
    public static Class<?> getClassType(final Class<?> clazz) throws Exception {
        Type genericType = clazz.getGenericSuperclass();
        if (!(genericType instanceof ParameterizedType)) {
            return Object.class;
        }
        Type[] params = ((ParameterizedType) genericType).getActualTypeArguments();

        if (!(params[0] instanceof Class)) {
            return Object.class;
        }
        return (Class<?>) params[0];
    }

    /**
     * 获取所有属性
     * @param clazz
     * @return
     */
    @SuppressWarnings("unchecked")
    public static List<Field> getAllFields(final Class<?> clazz){
        Field[] fields = clazz.getDeclaredFields();
        Field[] baseFields = getBaseFields();
        List<Field> fieldList = new ArrayList<Field>();
        fieldList.addAll(CollectionUtils.arrayToList(baseFields));
        fieldList.addAll(CollectionUtils.arrayToList(fields));
        return fieldList;
    }
    /**
     * 获取属性名
     * @param clazz 类
     * @return
     * @throws Exception
     */
    public static List<String> getFieldNames(final Class<?> clazz) throws Exception{
        List<String> fieldList = null;
        //获取所有的属性名
        Field[] fields = clazz.getDeclaredFields();
        if(fields != null && fields.length > 0){
            fieldList = new ArrayList<String>();
            for (Field field : fields) {
                fieldList.add(field.getName());
            }
        }
        return fieldList;
    }
    /**
     * 获取所有属性名
     * @param clazz 类
     * @return
     * @throws Exception
     */
    public static List<String> getAllFieldNames(final Class<?> clazz) throws Exception{
        List<String> fieldList = null;
        //获取所有的属性名
        List<Field> fields= getAllFields(clazz);
        if(fields != null && fields.size() > 0){
            fieldList = new ArrayList<String>();
            for (Field field : fields) {
                fieldList.add(field.getName());
            }
        }
        return fieldList;
    }
    /**
     * 获取基类属性
     * @return
     */
    @SuppressWarnings("unchecked")
    public static List<String> getBaseFieldNames(){
        return CollectionUtils.arrayToList(getBaseFields());
    }

    /**
     * 获取基类属性
     * @return
     */
    public static Field[] getBaseFields(){
        return SuperEntity.class.getDeclaredFields();
    }
    /**
     * 获取对象所有的属性值
     * @param clazz
     * @param obj
     * @return
     * @throws Exception
     */
    public static Map<String,Object> getAllFieldValues(final Class<?> clazz,Object obj) throws Exception{
        Map<String,Object> map = null;
        //获取所有的属性名
        List<Field> fieldList = getAllFields(clazz);
        if(fieldList != null && fieldList.size() > 0){
            map = new HashMap<String,Object>();
            for (Field field : fieldList) {
                Object value = null;
                if (field.isAccessible()) {  
                    value = field.get(obj);  
                } else {  
                    field.setAccessible(true);  
                    value = field.get(obj);  
                    field.setAccessible(false);  
                } 
                map.put(field.getName(), value);
            }
        }
        return map;
    }
    /**
     * 设置属性值
     * @param clazz 目标类
     * @param params 参数值(注:params中key值必须为目标类中的属性名,value为属性值。此方法目前仅支持单类属性值设置)
     * @return
     * @throws Exception
     */
    public static Object setFieldValue(final Class<?> clazz,Map<String,Object> params) throws Exception {
        Object obj = null;
        if(clazz == null) {
            throw new Exception("The Operation Error! Cause By: clazz is null");
        }
        if(params != null) {
            Class<?> objClass = getClassType(clazz);
            if(objClass == null) {
                throw new Exception("Error getting object instance! Cause By: objClass is null");
            }
            obj = objClass.newInstance();
            if(obj != null) {
                Set<String> keys =  params.keySet();
                for (String key : keys) {
                    String value = (String)params.get(key);
                    if(value == null) {
                        continue;
                    }
                    Field field = objClass.getDeclaredField(key);
                    if(field != null) {
                        field.setAccessible(true);
                        String fieldType = field.getType().getTypeName();
                        if("java.lang.Integer".equals(fieldType)) {
                            field.set(obj, Integer.valueOf(value));
                        }else if("java.lang.Long".equals(fieldType)) {
                            field.set(obj, Long.valueOf(value));
                        }else if("java.lang.Double".equals(fieldType)) {
                            field.set(obj, Double.valueOf(value));
                        }else if("java.util.Date".equals(fieldType)) {
                            field.set(obj, Date.parse(value));
                        }else {
                            field.set(obj, value);
                        }
                    }
                }
            }

        }
        return obj;
    }
    public static void main(String[] args) throws Exception {
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("userId", UUIDUtil.getUUID());
        map.put("nickName", "张三");
        map.put("age",22);
        OrgMember member = (OrgMember) setFieldValue(OrgMember.class,map);
        System.out.println(member.getUserId());
        System.out.println(member.getNickName());
        System.out.println(member.getAge());
    }
}


1、本文纯属个人爱好,仅供参考。
2、有疑问或建议可与我进行交流。 联系我

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值