`
阅读更多

JAVA 反射常用的方法

作者:1287789687@qq.com

(1)把List 转化为Map

场景:系统中有一个字典类,是一个实体类,如下(省略了getter,setter方法):

/**
 * Data Dictionary Entity
 */
@Entity
@Table(name = "t_dictionary")
public class CommonDictionary implements Cloneable, Serializable {

    private static final long serialVersionUID = 0x33d260729eadd26eL;

    /**
     * 主键id
     */
    private Long id;
    /**
     * 组id
     */
    private String groupId;
    /**
     * 键<br />不能取值为key,因为key是关键字
     */
    private String key2;
    /**
     * 值
     */
    private String value;
    /**
     * 描述
     */
    private String description;
 public CommonDictionary clone() throws CloneNotSupportedException {
        return (CommonDictionary) super.clone();
    }

 从数据库中查出的结果是List<CommonDictionary> anticounterfeit,我想把它转化为List,CommonDictionary  中的key2作为map的key,CommonDictionary 中的value作为map的value.

方法如下 :

/***
	 * 
	 * @param list
	 * @param clazz
	 * @param keyProperty : 该成员变量的值作为map的key
	 * @param valueProperty : 该成员变量的值作为map的value
	 * @return
	 */
	public static Map<String,Object> parseObjectList(List list,Class clazz,String keyProperty,String valueProperty){
		Map<String,Object> map=new HashMap<String, Object>();
		for(int i=0;i<list.size();i++){
			Object obj=list.get(i);
			Field keyf =null;
			Field valuef =null;
			try {
				keyf = clazz.getDeclaredField(keyProperty);
			} catch (NoSuchFieldException e) {
				keyf= getSpecifiedField(clazz.getSuperclass()/*
															 * may be null if it is
															 * Object .
															 */, keyProperty);
				// e.printStackTrace();
			}
			try {
				valuef = clazz.getDeclaredField(valueProperty);
			} catch (NoSuchFieldException e) {
				valuef= getSpecifiedField(clazz.getSuperclass()/*
															 * may be null if it is
															 * Object .
															 */, valueProperty);
				// e.printStackTrace();
			}
			keyf.setAccessible(true);
			valuef.setAccessible(true);
			try {
				map.put((String)keyf.get(obj), valuef.get(obj));
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return map;
	}

 依赖的方法:

/***
	 * Get Specified Field
	 * 
	 * @param clazz
	 * @param fieldName
	 * @return
	 */
	public static Field getSpecifiedField(Class<?> clazz, String fieldName) {
		Field f = null;
		if (ValueWidget.isNullOrEmpty(clazz)) {
			return null;
		}
		try {
			f = clazz.getDeclaredField(fieldName);
		} catch (NoSuchFieldException e) {
			return getSpecifiedField(clazz.getSuperclass()/*
														 * may be null if it is
														 * Object .
														 */, fieldName);
			// e.printStackTrace();
		}
		return f;
	}

 使用实例:

List<CommonDictionary> anticounterfeit=DictionaryParam.getList(Constant2.DICTIONARY_GROUP_ANTICOUNTERFEIT_CODE);
		QrSettingsBean qrSettingsBean=new QrSettingsBean();
		Map<String,Object>map=ReflectHWUtils.parseObjectList(anticounterfeit, CommonDictionary.class, "key2", "value");
ReflectHWUtils.setObjectValue(qrSettingsBean, map);
		model.addAttribute("qrSettingsBean", qrSettingsBean);

 

 

(2)把Map 转化为java对象,map的key对应对象的成员变量的名称

/***
	 * 利用反射设置对象的属性值. 注意:属性可以没有setter 方法.
	 * 
	 * @param obj
	 * @param params
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static void setObjectValue(Object obj, Map<String, Object> params)
			throws SecurityException, NoSuchFieldException,
			IllegalArgumentException, IllegalAccessException {
		if (ValueWidget.isNullOrEmpty(params)) {
			return;
		}
		Class<?> clazz = obj.getClass();
		for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
			Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it
					.next();
			String key = entry.getKey();
			Object propertyValue = entry.getValue();
			if (ValueWidget.isNullOrEmpty(propertyValue)) {
				continue;
			}
			Field name = getSpecifiedField(clazz, key);
			if (name != null) {
				name.setAccessible(true);
				name.set(obj, propertyValue);
			}
		}

	}
/***
	 * Get Specified Field
	 * 
	 * @param clazz
	 * @param fieldName
	 * @return
	 */
	public static Field getSpecifiedField(Class<?> clazz, String fieldName) {
		Field f = null;
		if (ValueWidget.isNullOrEmpty(clazz)) {
			return null;
		}
		try {
			f = clazz.getDeclaredField(fieldName);
		} catch (NoSuchFieldException e) {
			return getSpecifiedField(clazz.getSuperclass()/*
														 * may be null if it is
														 * Object .
														 */, fieldName);
			// e.printStackTrace();
		}
		return f;
	}

 

(3)把对象中 值为空字符串的成员变量 ,将其值改为null

/***
	 * 把对象中空字符串改为null
	 * @param obj : 要修改的对象:java bean
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static void convertEmpty2Null(Object obj) 
			throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
		List<Field> fieldsList =getAllFieldList(obj.getClass());
		for(int i=0;i<fieldsList.size();i++){
			Field f=fieldsList.get(i);
			Object vObj=getObjectValue(obj,f );
			if(f.getType().getName().equals("java.lang.String") && (vObj instanceof String) ){
				String str=(String)vObj;
				if(SystemHWUtil.EMPTY.equals(str)){
//					System.out.println(f.getName());
//					System.out.println(f.getType().getName());
					f.setAccessible(true);
					f.set(obj, null);
				}
			}
		}
	}

 依赖的方法:

/***
	 * get all field ,including fields in father/super class
	 * 
	 * @param clazz
	 * @return
	 */
	public static List<Field> getAllFieldList(Class<?> clazz) {
		List<Field> fieldsList = new ArrayList<Field>();// return object
		if (clazz == null) {
			return null;
		}

		Class<?> superClass = clazz.getSuperclass();// father class
		if (!superClass.getName().equals(Object.class.getName()))/*
																 * java.lang.Object
																 */{

			// System.out.println("has father");
			fieldsList.addAll(getAllFieldList(superClass));// Recursive
		}
		Field[] fields = clazz.getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {
			Field field = fields[i];
			// 排除因实现Serializable 接口而产生的属性serialVersionUID
			if (!field.getName().equals("serialVersionUID")) {
				fieldsList.add(field);
			}
		}
		return fieldsList;
	}
/***
	 * 获取指定对象的属性值
	 * 
	 * @param obj
	 * @param name
	 *            :Field
	 * @return
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static Object getObjectValue(Object obj, Field name)
			throws SecurityException, NoSuchFieldException,
			IllegalArgumentException, IllegalAccessException {

		// Field f = getSpecifiedField(obj.getClass(), name.getName());
		if (name == null) {
			System.out.println("[ReflectHWUtils.getObjectValue]"
					+ obj.getClass().getName() + " does not has field " + name);
			return null;
		}
		name.setAccessible(true);
		return name.get(obj);
	}

 

(4)判断两个对象的属性值是否都相等.

/***
	 * 判断两个对象的属性值是否都相等.
	 * 
	 * @param obj1
	 * @param obj2
	 * @param exclusiveProperties
	 *            : 要过滤的属性
	 * @return
	 * @throws SecurityException
	 * @throws IllegalArgumentException
	 * @throws NoSuchFieldException
	 * @throws IllegalAccessException
	 */
	public static boolean isSamePropertyValue(Object obj1, Object obj2,
			List<String> exclusiveProperties) throws SecurityException,
			IllegalArgumentException, NoSuchFieldException,
			IllegalAccessException {
		List<Field> fieldsList = getAllFieldList(obj1.getClass());
		for (int i = 0; i < fieldsList.size(); i++) {
			Field f = fieldsList.get(i);
			if ((!ValueWidget.isNullOrEmpty(exclusiveProperties))
					&& exclusiveProperties.contains(f.getName())) {// 过滤掉,不比较
				continue;
			}
			Object propertyValue1 = getObjectValue(obj1, f);
			Object propertyValue2 = getObjectValue(obj2, f);

			System.out.println(f.getName());
			if (propertyValue1 == propertyValue2) {// if propertyValue1 is null
				continue;
			}
			if (!isSameBySimpleTypes(propertyValue1, propertyValue2)) {
				return false;
			}
		}
		return true;
	}

/***
	 * 比较java 基本类型的值是否相同.
	 * 
	 * @param obj1
	 *            : String,Integer,Double,Boolean
	 * @param obj2
	 * @return
	 */
	public static boolean isSameBySimpleTypes(Object obj1, Object obj2) {
		if (obj1 == obj2) {
			return true;
		}
		if (obj1 instanceof Integer) {// int
			Integer int1 = (Integer) obj1;
			Integer int2 = (Integer) obj2;
			return int1.intValue() == int2.intValue();
		} else if (obj1 instanceof Double) {// double
			Double double1 = (Double) obj1;
			Double double2 = (Double) obj2;
			return double1.compareTo(double2) == 0;
		} else if (obj1 instanceof Boolean) {// double
			Boolean boolean1 = (Boolean) obj1;
			Boolean boolean2 = (Boolean) obj2;
			return boolean1.compareTo(boolean2) == 0;
		} else if (obj1 instanceof String) {
			String str1 = (String) obj1;
			String str2 = (String) obj2;
			return str1.equals(str2);
		} else if (obj1 instanceof Timestamp) {
			Timestamp time1 = (Timestamp) obj1;
			Timestamp time2 = (Timestamp) obj2;
			return time1.compareTo(time2) == 0;
		} else if (obj1 instanceof java.util.Date) {
			java.util.Date time1 = (java.util.Date) obj1;
			java.util.Date time2 = (java.util.Date) obj2;
			return time1.compareTo(time2) == 0;
		} else if (obj1 instanceof java.sql.Date) {
			java.sql.Date time1 = (java.sql.Date) obj1;
			java.sql.Date time2 = (java.sql.Date) obj2;
			return time1.compareTo(time2) == 0;
		}
		return obj1 == obj2;
	}

/***
	 * 获取指定对象的属性值
	 * 
	 * @param obj
	 * @param name
	 *            :Field
	 * @return
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static Object getObjectValue(Object obj, Field name)
			throws SecurityException, NoSuchFieldException,
			IllegalArgumentException, IllegalAccessException {

		// Field f = getSpecifiedField(obj.getClass(), name.getName());
		if (name == null) {
			System.out.println("[ReflectHWUtils.getObjectValue]"
					+ obj.getClass().getName() + " does not has field " + name);
			return null;
		}
		name.setAccessible(true);
		return name.get(obj);
	}

 

设置静态成员变量

    /***
     * 动态设置com.chanjet.gov.service.API 静态成员变量的值<br>
     *     注意:应用商店有多台主机进行负载均衡,所以设置完了不一定生效
     * @param key
     * @param val
     * @return
     */
    @RequestMapping(value = "/setAPIprops", produces = Constant.RESPONSE_CONTENTTYPE_PLAIN_UTF)
    @ResponseBody
    public String setAPIproperties(String key,String val) {
        if(!StringUtil.isNullOrEmpty(key)){
            try {
                Field field= API.class.getDeclaredField(key);
                field.setAccessible(true);
                try {
                    field.set(null,val);
                    return val;
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                    return e.getMessage();
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
                return e.getMessage();
            }
        }
        return "failed";
    }

 

作者:1287789687@qq.com

源码见附件

1
0
分享到:
评论

相关推荐

    Java 反射常用方法及实例.pdf

    Java 反射常用方法及实例

    Java常用的反射方法

    反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...

    Java反射常用机制

    NULL 博文链接:https://blessht.iteye.com/blog/1620391

    实验5 JAVA常用类.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    java反射机制文档及代码

    java中的反射机制,pdf文档,常用的反射用法都有详细的说明。

    Java实验2 反射.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    java反射封装jdbc全部方法

    Java反射封装jdbc方法,查询,修改,添加,删除,查询全部,为一个方法,SQL语句自己拼接,可常用,下载可终身受益

    反射常用方法整理(xmind)

    整理的Java反射的常用的一些方式,采用xmind的形式整理出来。希望有能够用到的。将java代码的各个组成部分封装为其他对象,可以在程序运行过程中操作这些对象,这就是java的反射机制;

    列举java语言中反射的常用方法及实例代码

    反射机制指的是程序在运行时能够获取自身的信息。这篇文章主要介绍了列举java语言中反射的常用方法,需要的朋友可以参考下

    Java 反射获取类详细信息的常用方法总结

    Java 反射获取类详细信息的常用方法总结,需要的朋友可以参考一下

    图解java反射机制及常用应用场景_字母哥博客

    图解java反射机制及常用应用场景_字母哥博客

    java反射机制详解

    对java反射机制常用类和方法,静态代理,动态代理有比较深入讲解

    完整版 Java高级教程 Java语言程序设计 第5章 Java反射(共9页).ppt

    完整版 Java高级教程 Java语言程序设计 第5章 Java反射(共9页).ppt 完整版 Java高级教程 Java语言程序设计 第6章 常用设计模式(共25页).ppt 完整版 Java高级教程 Java语言程序设计 第7章 Java注解(共10页).ppt...

    Java SE编程入门教程 java反射机制(共16页).pptx

    Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...

    反射基础思维导图

    内含反射的定义,反射的价值,,反射使用的方法以及xml文件的定义,价值,特点详解

    Java反射实例

    常用的属性,方法和构造函数的获取实例,个人实际学习总结,亲测有效!

    JAVA反射知识点总结

    本文介绍了JAVA反射类的基本概念,欢迎阅读学习,一起进步。 文章目录一.反射的基本概念二.反射常用类三.使用反射的基本步骤四.Class类讲解(1)Class类是反射机制的起源和入口(2)Class类存放类的结构信息(3)...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第13章_Java反射机制(共44页).pptx

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 特别适合新入门自学的新手同学,也适合老手回顾学习,巩固知识 第1章 Java语言概述 第2章 基本语法 ...第13章 Java反射 第14章 网络编程

    java技术文档 常用类和经典应用

    Math类的常用方法.pdf String与StringBuffer.pdf Vector类的用法.pdf 迭代器Iterator的用法.pdf 反射机制.pdf 访问路经问题.pdf 基于MVC和RMI的分布.pdf 经典的查询方式.pdf 经典的显示方法.pdf 面向对象的实现.pdf ...

Global site tag (gtag.js) - Google Analytics