JavaBean
Posted 墨冰心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaBean相关的知识,希望对你有一定的参考价值。
1,JavaBean是一种规范,也是对类的要求。
它要求Java类的成员变量提供getting和setting的方法,这样的成员变量我们称之为JavaBean属性。
比如:
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
2,JavaBean属性
JavaBean属性是具有getter/setter方法的成员变量。
也可以只提供getter方法,这样的属性叫只读属性;
也可以只提供setter方法,这样的属性叫只写属性;
如果属性类型为boolean类型,那么读方法的格式可以是get或is。
例如名为abc的boolean类型的属性,它的读方法可以是getAbc(),也可以是isAbc();
JavaBean属性名要求:前两个字母要么都大写,要么都小写:
3,内省
1)内省的目标是得到JavaBean属性的读、写方法的反射对象,通过反射对JavaBean属性进行操作的一组API。例如User类有名为username的JavaBean属性,通过两个Method对象(一个是getUsenrmae(),一个是setUsername())来操作User对象。
如果你还不能理解内省是什么,那么我们通过一个问题来了解内省的作用。现在我们有一个Map,内容如下
public class User { private String username; private String password; public User(String username, String password) { this.username = username; this.password = password; } public User() { } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String toString() { return "User [username=" + username + ", password=" + password + "]"; } }
现在需要把map的数据封装到一个User对象中!User类有两个JavaBean属性,一个叫username,另一个叫password。你可能想到的是反射,通过map的key来查找User类的Field!这么做是没有问题的,但我们要知道类的成员变量是私有的,虽然也可以通过反射去访问类的私有的成员变量,但我们也要清楚反射访问私有的东西是有“危险”的,所以还是建议通过getUsername和setUsername来访问JavaBean属性。
Map<String,String> map = new HashMap<String,String>(); map.put("username", "admin"); map.put("password", "admin123");
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
User user = new User();
for(PropertyDescriptor pd : pds) {
String name = pd.getName();
String value = map.get(name);
if(value != null) {
Method writeMethod = pd.getWriteMethod();
writeMethod.invoke(user, value);
}
}
System.out.println(user);
2)获取BeanInfo:通过Java.beans.introspector的getInfo()方法获取Java.beans.BeanInfo实例,比如
BeanInfo beaninfo=Introspector.getBeanInfo(User.class);
通过BeanInfo可以得到这个类的所有JavaBean属性的PropertyDescriptor对象,
获取属性描述符:PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();每一个PropertyDescription对象对应 一个JavaBean属性,然后就可以通过PropertyDescription对象来获取这个属性的setting/getting方法了
String getName()获取JavaBean属性名称
Method getWriterMethod() 获取写方法
Method getReadMethod() 获取读方法
参考上面的代码
3)提到内省,不能不提commons-beanutils这个工具。它底层使用了内省,对内省进行了大量的简化!使用beanutils需要的jar包:
commons-beanutils.jar 和 commons-logging.jar;
可以直接设置 username 和 password 的属性值 admin 和 admin123
User user = new User(); BeanUtils.setProperty(user, "username", "admin"); BeanUtils.setProperty(user, "password", "admin123");
也可以获取属性值
User user = new User("admin", "admin123"); String username = BeanUtils.getProperty(user, "username"); String password = BeanUtils.getProperty(user, "password"); System.out.println("username=" + username + ", password=" + password);
还可以封装Map数据到JavaBean对象中
Map<String,String> map = new HashMap<String,String>(); map.put("username", "admin"); map.put("password", "admin123"); User user = new User(); BeanUtils.populate(user, map); System.out.println(user);
以上是关于JavaBean的主要内容,如果未能解决你的问题,请参考以下文章