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()); } }