【黑马程序员】java基础加强------------------javabean与内省操作

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------




一、javaBean

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


2、javaBean的使用与作用

如果要在多个模块之间传递多个信息,可以将这些信息封装到一个javaBean中,这种javaBean的实例对象通常称之为值对象(value Object;简称VO)

总结:一个类被当做javaBean使用时,javaBean属性是根据方法名推断出来的。操作者使用这个类根本看不到java类中的内部成员变量。

3、命名的规则

比如: getId()---------->属性名可以推断出:id

getCPU---------->属性名可以推断出:CPU

4、好处:

a、javaEE开发中,经常使用到javaBean,很多开发环境要求按javaBean方式进行操作

b、用内省操作javaBean比用普通类的方式操作更方便

二、内省的操作

1、内省操作的理解:

英文单词为:Introspector,意思为:内部检查、内省主要对javaBean进行操作的。当一个类满足javaBean的条件时,就可以使用内省的方式操作javaBean中的数据。

2、内省的复杂操作:

通过一个类Introsptor类中的getBeanInfo()静态方法来获取某个javaBean类的BeanInfo对象,再通过BeanInfo对象中的getPropertyDescriptor()方法获取一个属性描述其对象的数组(PropertyDescriptor[ ])再通过遍历数组,就可以获取自己想要的属性描述,

再通过数组对象中的两个方法:getReadMethod()------->返回Method对象---->invoke()读取属性值

getWriteMethod()------->返回Method对象------>invoke()设置属性。


	 通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor ) 
	通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法, 
	 然后通过反射机制来调用这些方法。 
	 @Test 
	 public void test() throws Exception {  
		 Student st = new Student(); 
 		 // 1、通过Introspector类获得Bean对象的 BeanInfo, 
 
		BeanInfo entity = Introspector.getBeanInfo(Student.class); 


	 	 // 2、然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ) 
		  PropertyDescriptor pdrs[] = entity.getPropertyDescriptors();  
		 // 3、通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,  
		 for (PropertyDescriptor pd : pdrs) {   
			 System.out.println(pd.getName()); 
    		 	 System.out.println(pd.getShortDescription());        
			  System.out.println(pd.getDisplayName());      
			 if (pd.getName().equals("age")) { 
			 //age是什么类型?   
 			 Method md = pd.getWriteMethod();   
 			 md.invoke(st, 12); 
  		 	} 
  	
			//获取属性的类型 
	
 			System.out.println(pd.getName()+""+pd.getPropertyType());  
		 }   
		System.out.println(st.getAge()); 
  	}

 

3、   PropertyDescriptor类
这个类位于java.beans包中,该类提供了三个构造方法,如下:
PropertyDescriptor(String propertyName, Class<?> beanClass) 通过调用 getFoo 和 setFoo存储器方法,为符合标准 Java约定的属性构造一个 PropertyDescriptor。
PropertyDescriptor(String propertyName, Class<?> beanClass, String readMethodName, String writeMethodName) 此构造方法带有一个简单属性的名称和用于读写属性的方法名称。
PropertyDescriptor(String propertyName, Method readMethod, Method writeMethod) 
此构造方法带有某一简单属性的名称,以及用来读取和写入属性的 Method 对象。
通常我们只是用第一个构造方法,方便使用。
//简便的方法 
 @Test 
 public void test1()throws Exception{  
 	Student st = new Student(); 
 	 //通过构造器 创建 PropertyDescriptor对象 
  	PropertyDescriptor pd = new PropertyDescriptor("age",    Student.class); 
 	 Method md = pd.getWriteMethod(); //写操作  
	 md.invoke(st, 120); 
  	System.out.println(st.getAge()); 
	  md = pd.getReadMethod(); 
 	 int value = (Integer)md.invoke(st, null); //读操作
  	 System.out.println(value);  
 		
 }


4、   开源扩展BeanUtils工具包

BeanUtils等工具包都是由阿帕奇提供的,为了便于开发。BeanUtils可以将8种基本数据类型进行自动的转换,也就是一字符串形式给,以字符串形式体现出来,因此对于非基本数据类型,就需要注册转换器Converter,这就需要ConverUtils包。
好处:
1 、提供的set或get方法中,传入的是字符串,返回的还是字符串,因为在浏览器中,用户输入到文本框的都是以字符串的形式发送至服务器上的,所以操作的都是字符串。也就是说这个工具包的内部有自动将整数转换为字符串的操作。
2 、支持属性的级联操作,即支持属性链。如可以设置:人的脑袋上的眼睛的眼珠的颜色。这种级联属性的属性连如果自己用反射,那就很困难了,通过这个工具包就可以轻松调用。
注意:
要使用BeanUtils,就要将BeanUtils包添加到build path中,还要将还要将Apache公司的logging(日志)的jar包也添加进BuildPath。

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class BeanUtilsDemo1
{
   public static void main(String[] args) throws Exception
   {
      
Student st = new Student("heima", 24);

//使用BeanUtils的setProperty方法为p1对象的name和age属性设置值      
BeanUtils.setProperty(st,"name","lili");
BeanUtils.setProperty(st,"age","25");

//使用BeanUtils的getProperty方法获取p1对象的name和age属性值
Object obj1 = BeanUtils.getProperty(st,"name");
Object obj2 = BeanUtils.getProperty(st,"age");
System.out.println(obj1);
System.out.println(obj2);
    }
}






---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值