JavaBean

JavaBean

JavaBean就是符合如下规则的Java类:

1.必须有无参构造函数

2.必须有get方法(无参)和set方法(有参)

例子代码如下:

public class Person {
	private int x;
	public int getAge(){
		return x;
	}
	public void setAge(int age){
		this.x=age;
	}
}

简单内省

内省英文为Introspector,主要用于操作javabean。

下面的例子用内省读写Javabean类对象的属性值(以上面的Person类为例):

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class IntrospectionDemo {
	public static void main(String[] args)throws Exception {
		Person person=new Person();
		person.setAge(22);
		//内省get方法
		String propertyName="age";
		PropertyDescriptor pd=new PropertyDescriptor(propertyName, person.getClass());
		Method method=pd.getReadMethod();
		Object ret=method.invoke(person);
		System.out.println(ret);
		//内省set方法
		Object value=22;
		PropertyDescriptor pd2=new PropertyDescriptor(propertyName, person.getClass());
		Method method2=pd2.getWriteMethod();
		method2.invoke(person, value);
		//打印age
		System.out.println(person.getAge());
	}
}

上面的代码第9、10、11行可以用MyEclipse抽取成单独的方法,MyEclipse自动抽取方法功能的原则是,上面声明和初始化,此处调用的为输入参数;此处声明和赋值,下面调用的为返回值。也就是说选择抽取方法的代码块中,至多有一个变量被下面的代码调用,否则无法抽取。 

将上一段代码中的两个内省操作(9、10、11行)(15、16、17行)抽取成单独的方法:

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class IntrospectionDemo {
	public static void main(String[] args)throws Exception {
		Person person=new Person();
		person.setAge(22);
		//内省get方法
		String propertyName="age";
		Object ret = getProperty(person, propertyName);
		System.out.println(ret);
		//内省set方法
		Object value=22;
		setProperty(person, propertyName, value);
		//打印age
		System.out.println(person.getAge());
	}

	private static void setProperty(Person person, String propertyName,
			Object value) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd2=new PropertyDescriptor(propertyName, person.getClass());
		Method method2=pd2.getWriteMethod();
		method2.invoke(person, value);
	}

	private static Object getProperty(Object obj, String propertyName)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		PropertyDescriptor pd=new PropertyDescriptor(propertyName, obj.getClass());
		Method method=pd.getReadMethod();
		Object ret=method.invoke(obj);
		return ret;
	}
}

复杂内省

将上一段代码用Introspector类重写,功能不变:

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
public class IntrospectionDemo {
	public static void main(String[] args)throws Exception {
		Person person=new Person();
		person.setAge(22);
		
		String propertyName="age";
		Object ret = getProperty(person, propertyName);
		System.out.println(ret);
		
		Object value=26;
		setProperty(person, propertyName, value);
		//打印age
		System.out.println(person.getAge());
	}
	//内省set方法
	private static void setProperty(Object obj, String propertyName,
			Object value) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
//		PropertyDescriptor pd2=new PropertyDescriptor(propertyName, person.getClass());
//		Method method2=pd2.getWriteMethod();
//		method2.invoke(person, value);
		BeanInfo beanInfo=Introspector.getBeanInfo(obj.getClass());
		PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
		for (PropertyDescriptor pDescriptor : pds) {
			if (pDescriptor.getName().equals(propertyName)) {
				pDescriptor.getWriteMethod().invoke(obj, value);
			}
		}
	}
	//内省get方法
	private static Object getProperty(Object obj, String propertyName)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
//		PropertyDescriptor pd=new PropertyDescriptor(propertyName, obj.getClass());
//		Method method=pd.getReadMethod();
//		Object ret=method.invoke(obj);
		BeanInfo beanInfo=Introspector.getBeanInfo(obj.getClass());
		Object ret=null;
		PropertyDescriptor[] propertyDescriptors=beanInfo.getPropertyDescriptors();
		for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
			if (propertyDescriptor.getName().equals(propertyName)) {
				ret=propertyDescriptor.getReadMethod().invoke(obj);
			}
		}
		
		return ret;
	}
}

BeanUtils工具包

BeanUtils是Apache(一个软件基金会,中文名阿帕奇)提供的一个用于简化操作Javabean的代码的类库。

下载地址:点这里

导入方法:见这里

导入BeanUtils类库后还需导入阿帕奇的logging包。

使用方法见如下代码:

import org.apache.commons.beanutils.BeanUtils;
public class IntrospectionDemo {
	public static void main(String[] args)throws Exception {
		Person person=new Person();
		person.setAge(22);
		
		String propertyName="age";
//		Object ret = getProperty(person, propertyName);
		Object ret=BeanUtils.getProperty(person, propertyName);
		System.out.println(ret);
		
		Object value=26;
//		setProperty(person, propertyName, value);
		BeanUtils.setProperty(person, propertyName, value);
		//打印age
		System.out.println(person.getAge());
	}
}







你可能感兴趣的:(JavaBean)