7、内省
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小写。
使用JavaBean的好处:
- JavaEE开发中,经常要使用JavaBean;
- JDK中提供了对javaBean的一些API,这些API就叫内省。
操作JavaBean常用BeanUtils工具包,需要导入commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar两个JAR包。
package cn.itcast.day1;
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.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class IntroSpectorTest {
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3,5);
String propertyName = "x";
Object retVal = getProperty(pt1, propertyName);
System.out.println(retVal);
Object value = 7;
setProperties(pt1, propertyName, value);
System.out.println(pt1.getX());
//使用BeanUtils工具包
BeanUtils.setProperty(pt1, "x", "9");
System.out.println(BeanUtils.getProperty(pt1, "x"));
//对引用类型变量的操作:Date类中的setTime方法
BeanUtils.setProperty(pt1, "birthday.time", "111");
System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));
/* //Java 7 的新特性
Map map = {name:"lwp",age:25};
BeanUtils.setProperty(map, "name", "lll");
*/
PropertyUtils.setProperty(pt1, "x", 9);
System.out.println(PropertyUtils.getProperty(pt1, "x").getClass());
}
//重构-->抽取方法
private static void setProperties(Object pt1, String propertyName,
Object value) throws IntrospectionException,
IllegalAccessException, InvocationTargetException {
PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,pt1.getClass());
//获取set方法
Method methodSetX = pd1.getWriteMethod();
methodSetX.invoke(pt1,value);
}
//重构-->抽取方法
private static Object getProperty(Object pt1, String propertyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
//获取get方法(较简单)
Method methodGetX = pd.getReadMethod();
Object retVal = methodGetX.invoke(pt1);
/*
//另一种写法(较复杂)
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object retVal = null;
for (PropertyDescriptor pd : pds) {
if (pd.getName().equals(propertyName)) {
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(pt1);
break;
}
}
*/
return retVal;
}
}