开发框架时,经常要使用java对象的属性封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以SUN开发了一套API专门用于操作对象的属性。当然也可以使用第三方API,例如BeanUtils.
一、实体类
package cn.moving.introspector;
import java.util.Date;
public class Person {
private String name;
private int age;
private String password;
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean getSex() {
return true;
}
}
二、通过Java的Introspector类实现内省
package cn.moving.introspector;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
public class Demo1 {
/**
* 访问JavaBean属性的两种方式:1、直接调用get和set方法;2、使用内省技术。
* 内省技术也有:两种方式:
* 1、通过PropertyDescriptor类操作bean的属性
* 2、通过Introspector类获得Bean对象的BeanInfo,
* 然后通过BeanInfo来获取属性描述器(PropertyDescriptor)
* 通过属性描述器可以获取某个属性的get和set方法,然后通过反射机制调用这些方法
* @throws IntrospectionException
*/
@Test
//得到bean的所有属性
public void test1() throws IntrospectionException{
// BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class, Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
System.out.println(pd.getName());
};
}
@Test
//操纵bean的指定属性age
public void test2() throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
Method method = pd.getWriteMethod();
Person p = new Person();
method.invoke(p, 22);
System.out.println(p.getAge());
//获取属性的值
method = pd.getReadMethod();
System.out.println(method.invoke(p, null));;
}
//由于属性是封闭的,想了解内部属性,就要获得属性的类型,在赋值,取值
@Test
public void test3() throws IntrospectionException, RuntimeException, IllegalAccessException, InvocationTargetException{
PropertyDescriptor pd = new PropertyDescriptor("name", Person.class);
System.out.println(pd.getPropertyType());
Method method = pd.getWriteMethod();
Person p = new Person();
method.invoke(p, "maomao");
System.out.println(p.getName());
method = pd.getReadMethod();
System.out.println(method.invoke(p, null));;
}
}
三、通过Apach的BeanUtils实现内省
package cn.moving.introspector;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.junit.Test;
public class Beanutils {
@Test
public void test1() throws IllegalAccessException,
InvocationTargetException {
Person p = new Person();
BeanUtils.setProperty(p, "age", 22);
System.out.println(p.getAge());
}
@Test
public void test2() throws IllegalAccessException,
InvocationTargetException {
String name = "ZhangWeiChen";
String password = "123456";
int age = 22;
Person p = new Person();
BeanUtils.setProperty(p, "name", name);
BeanUtils.setProperty(p, "password", password);
BeanUtils.setProperty(p, "age", age);
System.out.println(p.getName());
System.out.println(p.getPassword());
System.out.println(p.getAge());
}
@Test
public void test3() throws Exception, InvocationTargetException {
String birthday = "1990-12-14";
ConvertUtils.register(new Converter() {
@Override
public Object convert(Class type, Object value) {
if (value == null)
return null;
if (!(value instanceof String)) {
throw new RuntimeException("只支持String类型数据转换");
}
String str = (String) value;
if (str.trim().equals(""))
return null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",
Locale.US);
try {
return sdf.parse(str);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}, Date.class);
Person p = new Person();
BeanUtils.setProperty(p, "birthday", birthday);
System.out.println(p.getBirthday());
System.out.println(BeanUtils.getProperty(p, "birthday"));
}
@Test
public void test4() throws Exception {
Person p = new Person();
Map map = new HashMap();
map.put("name", "maomao");
map.put("password", "123456");
map.put("birthday", "1990-12-14");
ConvertUtils.register(new DateLocaleConverter(), Date.class);
BeanUtils.populate(p, map);
}
}