JavaBean规范:
1.必须要有一个默认的构造器
2.提供get/set方法,如果只有get方法,那么这个属性是只读属性!
3.属性:有get/set方法的成员,还可以没有成员,只有get/set方法。
4.方法名称满足一定的规范,那么它就是属性! boolean类型的属性,它的读方法可以是is开头,也可以是get开头!
内省:
内省类--->Bean信息--->属性描述符--->属性的get/set对应的Method!---->可以反射了!
==============================用于把Map里的属性封装成JavaBean===================================
commons-beanutils,它是依赖内省完成的!
*导包:
>commons-beanutils.jar
>commons-logging.jar
BeanUtils.getProperty(Object bean, String propertyName)
BeanUtils.setProperty(Object bean, String propertyName, String propertyValue)
BeanUtils.populate(Map map, Object bean)
CommonUtils.toBean(Map map,Class class)
示例1:
People.java--->一个Javabean
1 package com.xjs.domain; 2 3 public class People { 4 private String name; 5 private int age; 6 private String sex; 7 public People() { 8 9 } 10 public String getName() { 11 return name; 12 } 13 public void setName(String name) { 14 this.name = name; 15 } 16 public int getAge() { 17 return age; 18 } 19 public void setAge(int age) { 20 this.age = age; 21 } 22 public String getSex() { 23 return sex; 24 } 25 public void setSex(String sex) { 26 this.sex = sex; 27 } 28 @Override 29 public String toString() { 30 return "People [name=" + name + ", age=" + age + ", sex=" + sex + "]"; 31 } 32 }
单元测试:
利用反射得到一个JavaBean实例
然后通过BeanUtils的setProperty();向bean中赋值
1 @Test 2 public void fun1() throws Exception{ 3 String className="com.xjs.domain.People"; 4 Class clazz=Class.forName(className); 5 Object bean=clazz.newInstance();//创建其实例 6 7 BeanUtils.setProperty(bean, "name", "金泰妍"); 8 BeanUtils.setProperty(bean, "age", "23");//会类型转换 9 BeanUtils.setProperty(bean, "sex", "女"); 10 11 System.out.println(bean); 12 }
示例2:
/*
* 把Map中的属性直接封装到一个bean中
* Map:{"username":"金泰妍","password","123"}
* 我们要把map的数据封装到一个JavaBean中,要求map的key与bean的属性名相同!
*/
User.java:--->一个JavaBean
1 package com.xjs.domain; 2 3 public class User { 4 5 private String username; 6 private String password; 7 8 9 public User() { 10 11 } 12 public String getUsername() { 13 return username; 14 } 15 public void setUsername(String username) { 16 this.username = username; 17 } 18 public String getPassword() { 19 return password; 20 } 21 public void setPassword(String password) { 22 this.password = password; 23 } 24 @Override 25 public String toString() { 26 return "User [username=" + username + ", password=" + password + "]"; 27 } 28 }
单元测试:
1 /* 2 * 把Map中的属性直接封装到一个bean中 3 * Map:{"username":"金泰妍","password","123"} 4 * 我们要把map的数据封装到一个JavaBean中,要求map的key与bean的属性名相同! 5 */ 6 @Test 7 public void fun2() throws Exception{ 8 Map<String,String> map=new HashMap<String,String>(); 9 map.put("username", "金泰妍"); 10 map.put("password", "123"); 11 12 User user=new User(); 13 BeanUtils.populate(user, map);//把map中的数据封装成了一个bean 14 System.out.println(user); 15 String name = map.get("username"); 16 System.out.println(name); 17 }
示例3:
把示例2中的部分方法封装,封装成一个工具类
CommonsUtils.java:
其中有一个前几篇文章中封装的一个生成不重复的32位长的大写字符串
1 package com.xjs.utils; 2 3 import java.util.Map; 4 import java.util.UUID; 5 6 import org.apache.commons.beanutils.BeanUtils; 7 8 9 public class CommonsUtils { 10 /** 11 * 生成不重复的32位长的大写字符串 12 * @return 13 */ 14 public static String uuid(){ 15 return UUID.randomUUID().toString().replace("-", "").toUpperCase(); 16 } 17 /** 18 * 把map转换成指定类型的JavaBean对象 19 * @param map 20 * @param clazz 21 * @return 22 */ 23 public static <T> T toBean(Map map,Class<T> clazz){ 24 try { 25 //1.创建指定类型的JavaBean对象 26 T bean = clazz.newInstance(); 27 //2.把数据封装到JavaBean中 28 BeanUtils.populate(bean, map); 29 //返回JavaBean对象 30 return bean; 31 } catch (Exception e) { 32 throw new RuntimeException(e);//自己抛出异常 33 } 34 } 35 }
此工具类,只需传入一个map和一个类即可,便能完成对Map中的数据的封装(到JavaBean中)
测试单元:
1 @Test 2 public void fun3(){ 3 Map<String,String> map=new HashMap<String,String>(); 4 map.put("username", "金泰妍"); 5 map.put("password", "123"); 6 7 /* 8 * request.getParamterMap();得到表单数据,然后封装成一个JavaBean 9 */ 10 User user=CommonsUtils.toBean(map, User.class); 11 System.out.println(user); 12 13 }
从中可以得到:从表单中获取的数据,以Map的形式得到,可以封装到对应的JavaBean中(一个类中),比如注册的信息。