黑马程序员_JDK1.5新特性(二)内省(IntroSpector)和JavaBean

------- android培训java培训、期待与您交流! ----------

7、内省

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小写。

使用JavaBean的好处:

  • JavaEE开发中,经常要使用JavaBean;
  • JDK中提供了对javaBean的一些API,这些API就叫内省。

操作JavaBean常用BeanUtils工具包,需要导入commons-beanutils-1.8.3.jarcommons-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;
	}

}




------- android培训java培训、期待与您交流! ----------
详细请查看:http://edu.csdn.net/heima/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值