JAVABean的内省操作

一,简单内省操作

1.定义PropertyDescriptor 类的对象pdnew的时候传入属性名字,Class

2.pd调用getReadMethod.返回值是Method类型

3.Method调用invoke方法执行

package cn.itcast.pro;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

import cn.itcast.person.Person;

public class Demo_JavaBean {

	/**
	 * javabean的简单内省操作
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Person p1=new Person("张三",10);
		String propertyName="name";		//要获取的属性名
		//定义属性描述类,参数1是属性名字,参数2是Class
		PropertyDescriptor pd=new PropertyDescriptor(propertyName, p1.getClass());
		//获得读取属性的方法
		Method method1=pd.getReadMethod();
		//执行并打印
		System.out.println(method1.invoke(p1));
		
		Method method2=pd.getWriteMethod();//获得写入属性值的方法
		method2.invoke(p1, "李四");
		System.out.println(p1.getName());
		
	}

}


 

二,复杂内省操作

1.Introspector类直接调用方法getBeanInfo得到一个BeanInfo 类的对象bif

getBeanInfo方法参数传入p2.class

2.BeanInfo的对象bif调用getPropertyDescriptors方法得到p2的所有属性组成的数组PropertyDescriptor[] pds

3.遍历这个数组,每个数组值调用getName()方法得到每个属性的名字,如果和指定的名字相同,就Method method=propertyDescriptor.getReadMethod();然后执行这个方法

 

package cn.itcast.pro;

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 cn.itcast.person.Person;

public class Demo_JavaBean2 {

	/**
	 * JavaBean的复杂内省操作
	 * @param args
	 * @throws InvocationTargetException 
	 * @throws IllegalArgumentException 
	 * @throws IllegalAccessException 
	 */
	public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Person p2=new Person("张三",12);
		String propertyName="name";
		
		//Introspector 类为通过工具学习有关受目标 Java Bean 支持的
		//属性、事件和方法的知识提供了一个标准方法。 
		BeanInfo bif=Introspector.getBeanInfo(p2.getClass());
		
		PropertyDescriptor[] pds=bif.getPropertyDescriptors();
		for (PropertyDescriptor propertyDescriptor : pds) {
			if(propertyDescriptor.getName().equals(propertyName)){
				Method method=propertyDescriptor.getReadMethod();
		//		System.out.println(method.invoke(p2));
				Object retVal=method.invoke(p2);
				
				System.out.println(retVal);
				break;
				
				}
			}
	}

}


 

三.使用BeanUtils包工具包操作JavaBean

 一.导入BeanUtils

1. commons-beanutils.jar  ==  commons-beanutils-bean-collections.jar + commons-beanutils-core.jar   所以导包只要导入commons-beanutils.jar就行了。

2. 在工程中,新建一个文件夹,名字叫lib,在lib里存入commons-beanutils.jar,然后,右键点击文件commons-beanutils.jar,选择Build Path------>Add to Build Path

3. 如果这个时候运行,会报错。java.lang.NoclassDefFoundError: org/apache/commons/logging/LogFactory  。由于commons-beanutils.jar运行,需要用到另一个jar包,我们没有导入,所以会报错。  导入org/apache/commons/logging 包, commons-logging-1.1.jar  也放到lib文件夹中,操作步骤和2相同。

4. 这个时候我们可以用BeanUtils工具包了。

 二.操作

1.简单操作

   BeanUtils.getProperty(p1,name);//p1Person类的对象,name是属性

BeanUtils.setProperty(p1,age,20); //设置p1对象的age属性的值是20.  

      这里要注意,传入的参数,只能是字符串,BeanUtils工具包会把这个字符串转成程序需要的类型。

2.级联操作

BeanUtils包支持对属性的级联操作。例如我们有一个类,这个类中有一个私有属性,类型的Date  

 

public class Person implements Comparable<Person>,Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
  	}
}

 

通过查API,我们发现Date类对象,也有一个setTime方法,public void setTime (long time)所以,也相当于javabean,我们可以认为Date类有一个属性叫time

下面我们来对birthday属性进行级联操作。

BeanUtils.setProperty(p1,birthday.time,12345);

运行后,会有报错: java.lang.IllegelArgumentExcetion: No bean specified (没有指定bean)

原因是我们的birthday没有赋初值。 修改代码为private Date birthday=new Date();

BeanUtils.getProperty(p1,birthday.time);

2.BeanUtils包其他方法

static void copyProperties(java.lang.Object dest, java.lang.Object orig );

//把一个对象的属性拷贝到另一个对象的属性上

static java.util.Map  describe(java.lang.Object bean ) 

//把一个javabean转换成Map集合,这个方法参数是一个对象。比如传入p (一个Person类对象),Map 集合的键是属性名,值是属性值。

static void populate (java.lang.Object  bean ,   java.util.Map.properties)

//把一个Map集合,封装成javabean

3.PropertyUtils  

这个类也有set方法。

propertyUtils.setProperty(p,age,20);  //设置page属性是20

这里要注意propertyUtilsBeanUtils的区别,propertyUtils的参数是20,也就是age自己的类型int,而BeanUtils 参数是字符串


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值