内省
- 内省是什么?
开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都是用反射技术完成此类操作过于麻烦.
于是sun公司开发了一套API,专门用于操作java对象的属性 .
- 什么是java对象的属性和属性的读写方法?
javaBean用来封装数据.凡是有get或set方法的字段,都称之为属性.Bean总共有几个属性呢?自己类的属性个数+Object中的一个getClass属性.
- 内省访问javaBean属性的两种方式:
- 通过PropertyDescriptor类操作Bean的属性
- 通过Instrtospector类获得Bean对象的BeanInfo,然后通过BeanInfo来获得属性的描述器,通过这个属性描述器就可以获取某个属性对应的get/set方法,然后通过反射机制来调用这些方法.
@Test
// 使用内省获得Person类的bean属性
public void test1() throws Exception {
// 使用内省获得该类的bean属性,凡是get,set的都是该类的属性,当然也包括Object的getClass属性
BeanInfo bf = Introspector.getBeanInfo(Person.class);
// 获得bean属性的描述器
PropertyDescriptor[] pds = bf.getPropertyDescriptors();
// 遍历描述器中的每个属性的描述
for (PropertyDescriptor pd : pds) {
System.out.println(pd.getName());
}
}
@Test
//除去Object的属性,得到Person自己类的属性
public void test2() throws Exception {
// 剁掉Object的class属性,得到bean自己的属性
BeanInfo bean = Introspector.getBeanInfo(Person.class, Object.class);
PropertyDescriptor[] pds = bean.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
System.out.println(pd.getName());
}
}
@Test
//操作bean的指定属性
public void test3() throws Exception {
Person p = new Person();
// 操纵bean的指定属性
PropertyDescriptor pd = new PropertyDescriptor("name", Person.class);
// 调用该属性的set方法
Method me = pd.getWriteMethod();
String name = (String) me.invoke(p, "gaowei");
// System.out.println(p.getName());
Method mm = pd.getReadMethod();
System.out.println(mm.invoke(p, null));
}
@Test //获得指定属性的类型 public void test4() throws Exception{ PropertyDescriptor pd=new PropertyDescriptor("age",Person.class); System.out.println(pd.getPropertyType()); }
BeanUtils
@Test // 使用BeanUtils操作Bean的属性 public void test1() throws Exception, Exception { Person p = new Person(); BeanUtils.setProperty(p, "name", "value"); System.out.println(p.getName()); }
// 使用BeanUtils将用户的数据封装到对象中 @Test public void test2() throws Exception, InvocationTargetException { String name = "高薇"; String password = "519"; int age = 22; Person p = new Person(); BeanUtils.setProperty(p, "name", name); //BeanUtils实现了int到string的转换 //BeanUtils默认支持八种基本数据类型的转换 BeanUtils.setProperty(p, "password", password); BeanUtils.setProperty(p, "age", age); System.out.println(p.getName() + ":" + p.getPassword() + ":" + p.getAge()); }
// 使用BeanUtils将用户的数据封装到对象中 @Test public void test3() throws Exception, InvocationTargetException { String name = "高薇"; String password = "519"; int age = 22; String birthday="1991-06-30"; ConvertUtils.register(new DateLocaleConverter(), Date.class); Person p = new Person(); BeanUtils.setProperty(p, "name", name); BeanUtils.setProperty(p, "password", password); BeanUtils.setProperty(p, "age", age); BeanUtils.setProperty(p, "birthday", birthday); System.out.println(p.getName() + ":" + p.getPassword() + ":"+p.getBirthday().toLocaleString()+p.getAge()); }
参见Person.classpublic class Person { private String name; private int age; private String password; public 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; } }
- jar包的处理:
- 工程目录中New Folder -----命名为lib.
- 导入需要的jar包,一般jar包都是名称最短的.99%不会搞错.
- BeanUtils使用的jar包有两个:(第三方jar包)
- commons-beanutils-1.8.3
- commons-logging-1.1.1
- 导入jar包,之后build path,jar包图标变成奶瓶就哦啦~
- BeanUtils使用的jar包有两个:(第三方jar包)