黑马程序员-javaBean(高新技术)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

 

JavaBean

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

JavaBean类内部有set()get()方法

如果一个普通类有set()get()方法,可以当做JavaBean来处理

 

JavaBean的属性X是根据其中的setX和getX方法来确定的,而不是依据其中的变量,如方法名为setName,该方法是设置name,getName获取name;去掉set或者get前缀,剩余部分就是属性名称。如果剩余部分的第二个字母小写,则把剩余部分改为小写如果第二个字母是小写的,那么把第一个字母变成小写的,如果第二个字母是大写的,那么第一个字母不变

例如:1:通过setAPI()获得属性API   2:通过setName()获得属性name

 

JavaBean是反射的实际应用之一:它能让一些工具可视化的操作软件组件。这些组件通过反射的动态载入并取得java类的属性

 

如果第二个字母是小写的,那么把第一个字母变成小写的,如果第二个字母是大写的,那么第一个字母不变

 

JavaBean来获取属性的值

示例:

 

public class javaBean {
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		ReflectPoint rp1 = new ReflectPoint(7,"hello");
		String PropertyName = "x";//设置属性的名字
		
		PropertyDescriptor pd = new PropertyDescriptor(PropertyName,rp1.getClass());
		//传入X的变量,和对象,正式获取对象rp1的属性
/*Method methodSetX = pd.getWriteMethod();
		methodSetX.invoke(rp1, 10);*/
		Method methodGetX = pd.getReadMethod();
		//获取对象rp1的属性X的读取方法,返回值是Method类型的
		Object retValue = methodGetX.invoke(rp1);
		//调用对象rp1的getX()这个方法,会有一个返回值,外界是不知道是什么类型的,所以用Object接收
		System.out.println(retValue);
	}

}


 

BeanUtils工具包

1BeanUtils等工具包都是由阿帕奇提供的,为了便于开发。

2BeanUtils可以将8种基本数据类型进行自动的转换,因此对于非基本数据类型,就需要注册转换器Converter,这就需要ConverUtils包。

3、好处:

       1)提供的setget方法中,传入的是字符串,返回的还是字符串,因为在浏览器中,用户输入到文本框的都是以字符串的形式发送至服务器上的,所以操作的都是字符串。也就是说这个工具包的内部有自动将整数转换为字符串的操作。

       2)支持属性的级联操作,即支持属性链。如可以设置:人的脑袋上的眼睛的眼珠的颜色。这种级联属性的属性连如果自己用反射,那就很困难了,通过这个工具包就可以轻松调用。

4、可以和Map集合进行相互转换:可将属性信息通过键值对的形式作为Map集合存储(通过staticjava.util.Mapdescribe(java.lang.Object bean)的方法)。也可以将Map集合转换为JavaBean中的属性信息(通过static voidpopulate(java.lang.Objectbean, java.util.Map properties)的方法)。

注:要正常使用BeanUtils工具,还要将Apache公司的logging(日志)jar包也添加进BuildPath

Eclipse操作技巧:

       在工程中导入工具jar包。

两种方式:

       1,右键项目--选择Properties---Java Build Path--选择Liberiers标签。AddExternalJars--选择要导入的jar包。即可。

       这样做有个问题就是如果jar路径发生变化。项目就不能使用到这个jar包。

        2,在项目中建立一个lib目录,专门用于存放项目所使用到的jar工具包。将要使用到jar包复制粘贴进来,并在jar上点右键--选择BuilderPath---Add to BiuldPath,即可。这时jar包中的对象,就可以使用了。

       推荐用第二种方式:jar包绑定到项目内部,随着项目移动。

 

现在用BeanUtils去操作上面的代码

获取X的值:

BeanUtils.getProperty(rp1,”x”);//此时返回的就是属性X的值

设置X的值

BeanUtils.setProperty(rp1,X,9)//x的值设置为9,要注意参数值是String类型

虽然X的值的类型是int类型,但是用BeanUtils设置的时候,要用String类型设置,内部自动完成了类型转换

BeanUtils可以操作javaBean,还可以操作map

这属于java7的属性

Map map = {name:”zxx”,age:18};

BeanUtils.setProperty(map,”xxx”,”20”);//这里年龄值要用字符串形式

 

PropertyUtils也能够对属性进行赋值(与BeanUtils有一点小小的区别):

PropertyUtils.setProperty(map,”xxx”,20);//这里的年龄值用属性本身的类型

 

小总结:

BeanUtils是以字符串的形式对属性进行操作

PropertyUtils是以属性本身的类型来操作

JavaBean使用范例:

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 java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

public class IntroSpectorTest {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		ReflectPoint pt1 = new ReflectPoint(3,5);
		
		String propertyName = "x";
		//"x"-->"X"-->"getX"-->MethodGetX-->
		Object retVal = getProperty(pt1, propertyName);
		System.out.println(retVal);
		
		Object value = 7;
		
		setProperties(pt1, propertyName, value);

		System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName());
		BeanUtils.setProperty(pt1, "x", "9");
		System.out.println(pt1.getX());

		BeanUtils.setProperty(pt1, "birthday.time", "111");
		System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));
		
		PropertyUtils.setProperty(pt1, "x", 9);
		System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());
		
	}

	private static void setProperties(Object pt1, String propertyName,
			Object value) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass());
		Method methodSetX = pd2.getWriteMethod();
		methodSetX.invoke(pt1,value);
	}

	private static Object getProperty(Object pt1, String propertyName)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		
		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;
	}

}


 

 

 

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值