- 浏览: 235204 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
cherami:
解法3有问题,在n很大的时候会导致baseNum溢出使得结果不 ...
阶乘算法之一N! 末尾有多少个零 -
yubenjie:
我怎么没看出多线程啊,就单线程再跑嘛
多线程编程之理财 -
fei229670104:
多线程 不错
多线程编程之理财 -
fei229670104:
liujiafei_2007 写道你好,问个问题,取钱时不用判 ...
多线程编程之存钱与取钱 -
liujiafei_2007:
你好,问个问题,取钱时不用判断取出的金额是否大于账户的余额吗? ...
多线程编程之存钱与取钱
最近项目里需要一个工具类,它的功能是传入一个Map后可以返回一个JavaBean对象。很喜欢写这样的Java服务,首先我想到的是要通过Java 的反射去实现匿名类的方法调用,这样才可以把Map里的值set 到JavaBean里。其实这里用Java的自省会更方便,下面两个方法就是一个通过反射,一个通过自省来实现本功能。
1:JavaBean类
1 package cn.com.bean;
2 public class Person {
3 private int id;
4 private String name;
5 private String birthday;
6 private String type;
7 private String hobby;
8 public int getId() {
9 return id;
10 }
11 public void setId(int id) {
12 this.id = id;
13 }
14 public String getName() {
15 return name;
16 }
17 public void setName(String name) {
18 this.name = name;
19 }
20 public String getBirthday() {
21 return birthday;
22 }
23 public void setBirthday(String birthday) {
24 this.birthday = birthday;
25 }
26 public String getType() {
27 return type;
28 }
29 public void setType(String type) {
30 this.type = type;
31 }
32 public String getHobby() {
33 return hobby;
34 }
35 public void setHobby(String hobby) {
36 this.hobby = hobby;
37 }
38 @Override
39 public String toString(){
40 StringBuffer sb = new StringBuffer();
41 sb.append("{");
42 sb.append("'id':'"+getId()+"',");
43 sb.append("'name':'"+getName()+"',");
44 sb.append("'type':'"+getType()+"',");
45 sb.append("'birthday':'"+getBirthday()+"',");
46 sb.append("'hobby':'"+getHobby()+"'");
47 sb.append("}");
48 return sb.toString();
49 }
50 }
2 工具类:
51 package cn.com.util;
52 import java.beans.BeanInfo;
53 import java.beans.IntrospectionException;
54 import java.beans.Introspector;
55 import java.beans.PropertyDescriptor;
56 import java.lang.reflect.Field;
57 import java.lang.reflect.InvocationTargetException;
58 import java.lang.reflect.Method;
59 import java.util.Map;
60 import java.util.Set;
61 public class ConvertUtil {
62
63 /**
64 * 把一个Map转换成一个实体类JavaBean(通过反射机制实现)
65 * @param map
66 * @return
67 */ public Object convertMayToBean(Map map) throws InstantiationException, IllegalAccessException{
68 if(map==null || map.size()==0){
69 return null;
70 }
71 if(map.get("table-name")==null){
72 return null;
73 }
74 String beanName = new ReadUtil().readString((String)map.get("table-name"));
75 if(beanName==null || "".equals(beanName))
76 {
77 return null;
78 }
79 Class clazz = null;
80 try {
81 clazz= Class.forName(beanName);
82 } catch (ClassNotFoundException e) {
83 e.printStackTrace();
84 }
85 Object object = clazz.newInstance();
86
87 //获得对象的所有属性
88 Field[] fields=clazz.getDeclaredFields();
89 for(int i=0;i<fields.length;i++){
90 String key = fields[i].getName();
91 if(map.containsKey(key)){
92 String tempKey = key.substring(0,1).toUpperCase()+key.substring(1,
93 key.length());
94 try {
95 Method method = clazz.getMethod("set"+tempKey,new Class[] {fields[i].getType()});
96 Object args[] = new Object[1];
97 args[0] = map.get(key);
98 method.invoke(object,args);
99 } catch (SecurityException e) {
100 e.printStackTrace();
101 } catch (NoSuchMethodException e) {
102 e.printStackTrace();
103 }catch (IllegalArgumentException e) {
104 e.printStackTrace();
105 } catch (IllegalAccessException e) {
106 e.printStackTrace();
107 } catch (InvocationTargetException e) {
108 e.printStackTrace();
109 }
110 }
111 }
112 return object;
113 }
114
115 /**
116 * 下面通过内省实现
117 * @param map
118 * @return
119 */
120 public Object convertMap2Bean(Map<String, Object> map) throws IntrospectionException,
121 InstantiationException, IllegalAccessException, IllegalArgumentException,
122 InvocationTargetException, ClassNotFoundException{
123 if(map==null || map.size()==0){
124 return null;
125 }
126 if(map.get("table-name")==null){
127 return null;
128 }
129 String beanName = new ReadUtil().readString((String)map.get("table-name"));
130 if(beanName==null || "".equals(beanName))
131 {
132 return null;
133 }
134 Class c = Class.forName(beanName);
135 Object obj=c.newInstance();
136 BeanInfo beanInfo = Introspector.getBeanInfo(c);
137 PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
138 Set<String> keys=map.keySet();
139 for (String key : keys) {
140 for (PropertyDescriptor pd : pds) {
141 if(pd.getName().equals(key)){
142 pd.getWriteMethod().invoke(obj, map.get(key));
143 break;
144 }
145 }
146 }
147 return obj;
148 }
149 }
150
151
152 package cn.com.util;
153 import java.io.IOException;
154 import java.io.InputStream;
155 import java.util.HashMap;
156 import java.util.Map;
157 import java.util.Properties;
158 public class ReadUtil {
159 public String readString(String tableName){
160 InputStream in = ClassLoader.getSystemResourceAsStream("table-bean.properties");
161 Properties p = new Properties();
162 try {
163 p.load(in);
164 } catch (IOException e) {
165 e.printStackTrace();
166 }
167 return p.getProperty(tableName);
168 }
169 }
3 一个配置文件:table-bean.properties
t_person_info=cn.com.bean.Person
4 测试类
170 import java.beans.BeanInfo;
171 import java.beans.IntrospectionException;
172 import java.beans.Introspector;
173 import java.beans.PropertyDescriptor;
174 import java.lang.reflect.InvocationTargetException;
175 import java.util.HashMap;
176 import java.util.Map;
177 import cn.com.bean.Person;
178 import cn.com.util.ConvertUtil;
179 public class Test {
180
181 public static void main(String[] args) throws Exception {
182
183 Map map = new HashMap();
184 map.put("id", 1111);
185 map.put("name", "zhou yang");
186 map.put("birthday", "1989-11-10");
187 map.put("type", "1");
188 map.put("hobby", "reading");
189 map.put("table-name", "t_person_info");
190 ConvertUtil util = new ConvertUtil();
191 //Object object = util.convertMayToBean(map);
192 // System.out.println(object.toString());
193
194 Object object = util.convertMap2Bean(map);
195 System.out.println(object.toString());
196
197 new Test().testJavaBeanInfo();
198 }
199
200 //内省测试方法
201 public void testJavaBeanInfo() throws Exception{
202 Person p = new Person();
203 p.setBirthday("2011-10-20");
204 p.setId(007);
205 p.setName("吉它");
206 p.setType("2");
207 p.setHobby("弹吉它、看风景");
208
209 BeanInfo bean = Introspector.getBeanInfo(p.getClass(),Object.class);
210
211 PropertyDescriptor[] pds = bean.getPropertyDescriptors();
212 for(int i=0;i<pds.length;i++){
213 System.out.print("name: "+pds[i].getName()+" ");
214
215 /**
216 * 下面这句invok(p,null),传参数为p,正好是上面的Person对象实例
217 * 表示调的就是上面的p对象的读方法(即getXXX())
218 */
219 System.out.println(pds[i].getReadMethod().invoke(p,null));
220
221 }
222 }
223 }
JavaBean的内省就是对JavaBean中的属性和事件的一些处理方法,通过setName和getName去访问和设置name的值。Java中通过Introspector类的getBeanInfo(beanClass)静态方法,获得JavaBean的BeanInfo集合,再遍历BeanInfo集合来得到JavaBean的某一个属性的属性描述器(PropertyDescriptor),利用PropertyDescriptor得到JavaBean中属性的get和set方法。
前人总结,后人乘凉,但要有所思,才为已用。
发表评论
-
Enum的深入浅出
2015-06-18 09:34 1480还记得上一篇是如何运用Enum来定义一周的的吗? ... -
JAVA中的Enum
2015-06-17 14:41 1388Enum是计算机编程语言中的一种数据类型---枚举类型。在实 ... -
多线程篇之二JAVA多线程之概念篇
2014-02-24 16:10 1661一:JAVA中的线程 在java中线程的应用类主 ... -
多线程篇之一 概念与原理
2014-02-24 15:47 1894一:线程 线程(英语:thread)是操作系统能够进行运 ... -
JAVA深入浅出流之二字节流
2014-01-14 13:59 2472在《 ... -
JAVA深入浅出流之一IO流
2014-01-14 11:39 4914工作三年了,可自己对文件读写还是一知半解,写代码的时候都不 ... -
JAVA Annotation之定义篇
2013-12-15 14:38 1890Annotation: 译为注释或注解 An a ... -
阶乘算法之一N! 末尾有多少个零
2013-06-07 16:32 7933... -
算法之时间复杂度
2013-06-07 15:11 3067在计算机科学中,算法的时间复杂度是一个函数,它定量描 ... -
JAVA 静态变量与非静态变量初始化顺序之新解
2012-12-28 16:43 3926今天和同事争论一问题,关于静态变量与非静态变量的初始化顺序,谁 ... -
求二进制数中1的个数
2012-08-21 09:56 7871解法一: 对于一个正整数如果是偶数,该数的二 ... -
求最大公约数之四部曲
2012-07-26 18:35 1959解法一: 欧几里得算法 ( 又称辗转 ... -
《编程之美》--中国象棋将帅问题
2012-07-20 14:16 2850最近在看微软研究院出版的《编程之美》一书,对于该书中提到的一些 ... -
java 位移运算与乘法运算
2012-07-09 14:25 5466对于 JAVA 编程中,适当的采用位移运算,会减少代 ... -
Java 求素数运算
2012-06-26 16:06 2286网络上对求素数之解数不胜数,我在此总结归纳一下,同时对一些编码 ... -
JAVA海量数据处理之二(BitMap)
2012-06-20 18:07 12109路漫漫其修远兮,吾将上下而求索。想要更快 ... -
海量数据处理之一
2012-06-18 18:37 2840... -
HTTP 协议通信
2012-01-18 18:11 1854一:简介 ... -
Java 字节码之解析一
2011-12-01 15:20 5048一: J ... -
Java常用工具--jps
2011-10-30 18:24 2038jps-虚拟 ...
相关推荐
`Map`和`JavaBean`之间的转换就是一个典型的场景。`JavaBean`是一种符合特定规范的类,通常用来封装数据,而`Map`则是一种键值对的集合,两者在实际应用中有各自的适用范围。本文将深入探讨如何通过反射机制实现`Map...
在Java开发中,JSON(JavaScript Object ...通过这样的工具类,我们可以简化JSON、Map和JavaBean之间的转换过程,提高代码的可读性和可维护性。在实际开发中,了解并熟练掌握这些转换方法对于处理数据交互至关重要。
使用Java反射机制,将给定的javaBean转化为Map数类型,以及将Map类型的数据转化为JavaBean
JSON 与 JavaBean、Map 和 List 之间的转换问题 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。在 Java 开发中,经常需要将 JSON 数据与 JavaBean、Map ...
将list<Map>转换成JavaBean的工具类
将JavaBean转换为Map是一种常见的需求,特别是在处理数据绑定、JSON序列化或者存储时。标题“Desktop_javaBean转换Map工具_”暗示了这是一个方便的工具或代码片段,用于快速将JavaBean实例转换为Map对象。 描述中...
Javabean和map相互转化方法代码示例 在 Java 开发中,经常需要将 JavaBean 对象和 Map 对象相互转换。例如,在导入数据时,可能需要将 Map 对象转换为 JavaBean 对象,以便更方便地处理数据。本文将介绍 JavaBean ...
JavaBean和Map以及String与JSON之间的转换在Java开发中是非常常见的操作。这涉及到Java对象的序列化和反序列化,通常用于数据交换或持久化存储。以下是对这些转换的详细解释和示例。 1. JavaBean到JSON JavaBean是...
**工具** 如Apache Commons BeanUtils库也可以用来在JavaBean和Map对象之间进行转换,虽然它不直接处理XML,但可以作为进一步转换的基础。此外,一些IDE如Eclipse和IntelliJ IDEA提供了内置的功能来自动生成JavaBean...
Bean与MAP间互转换的工具类。 1.将一个 Map 对象转化为一个 JavaBean,可指定BEAN的类型; 2.将一个 JavaBean 对象转化为一个 HashMap;
一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List<Map, Object>>结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List<Map, Object>>转化为...
excel-bean 主要功能是 JavaBean 与 Excel 数据行之间的互相转换,普通项目中都会有Excel的导入导出功能,使用该工具可以大大提高工作效率,使开发者不必关系复杂的Excel解析。 主要解决 Excel 行类型数据与 ...
总之,MapStruct提供了一种优雅的对象转换解决方案,它通过自动化代码生成,解决了传统JavaBean转换的痛点,提高了开发效率,降低了出错风险,并保持了代码的简洁性和可维护性。在现代Java开发中,MapStruct是一个...
在上面的代码中,我们使用 Java 反射机制获取了 JavaBean 对象的所有字段信息,然后将这些字段信息与 Map 对象的键值对进行匹配,并将匹配的结果设置到 JavaBean 对象中。这样我们就可以将 Map 对象自动装配到 ...
在Java中,我们可以使用反射机制将JavaBean转换为Map,反之亦然。以下是一个简单的封装类`MapUtils`,提供了两个主要的方法: 1. `map2Java`: 这个方法用于将Map对象转换为JavaBean对象。它接受一个JavaBean实例和...
如果有一个Map对象,其中包含了与Person类属性相对应的键值对,我们可以这样转换: ```java Map, Object> map = new HashMap(); map.put("name", "张三"); map.put("age", 25); Person person = new Person(); ...
首先,解析JSON字符串到`Map, Object>`,然后遍历这个映射,将键(属性名)转换为驼峰式,并创建对应的JavaBean实例,设置属性值。 5. **使用工具类或方法**:可以创建一个静态方法或者工具类,接收JSON字符串和...
主要给大家介绍了关于在java中用ObjectMapper类实现Json与bean转换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
JavaBean2Map将JavaBean转换为Map,便于在不关心对象实例的情况下操作属性。 3. **XML配置驱动**: XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,常用于配置文件。在JavaBean2Map中,XML...
**Dozer:JavaBean到JavaBean的映射神器** Dozer是Java开发中的一款强大工具,主要用于Java Bean之间的数据映射。它简化了在不同对象模型之间传递数据的过程,尤其在处理复杂对象结构时,其功能显得尤为重要。Dozer...