有点长,希望楼主能仔细观看
首先:内省,主要操作JavaBean的.
JavaBean是一个特殊的Java类,
方法打头一定要是get,或者set
对JavaBean的简单内省操作
-------补充:..
内省访问JavaBean属性的两种方式:
通过PropertyDescriptor类操作Bean的属性
通过Instospector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),
通过这个属性描述其就可以获取某个属性对应的getter/setter方法,然后通过反射机制调用这些方法.
内省-beanutils工具包
Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单易用的API操作Bean的属性-->BeanUtils
工具包内常用的类
BeanUtils
PropertyUtils
ConvertUtils.regsiter(Converter convert,Class clazz)
------补充结束
需求:用内省的方式来读取JavaBean的x属性.
PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
PropertyDescriptor(String propertyName, Class<?> beanClass)
通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。
- //需求:用内省的方式来读取JavaBean的x属性.
- import java.beans.IntrospectionException;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- public class IntroSpectorTest {
- public static void main(String[] args)throws Exception
- {
- ReflectPoint pt1 = new ReflectPoint(3,4);
-
- String propertyName = "x";
- //普通方法:"x"-->"X"-->"getX"-->"Method getX"-->得到值
-
- //内省的方法:PropertyDescriptor(属性名,JavaBean类),属性描述符
- Object retVal = getProperty(pt1, propertyName);
- System.out.println(retVal);
-
- //接下来,set一个值
- Object value = 1;
-
- setProperty(pt1, propertyName, value);
- System.out.println(pt1.getX());
- }
- private static Object getProperty(Object pt1, String propertyName)
- throws IntrospectionException, IllegalAccessException,
- InvocationTargetException {
- //PropertyDescriptor(属性名,JavaBean类),属性描述符
- PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,pt1.getClass());
- Method methodGetX=pd1.getReadMethod();
- Object retVal = methodGetX.invoke(pt1);
- return retVal;
- }
- private static void setProperty(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);
- }
- }
复制代码 对JavaBean的复杂内省操作
采用遍历BeanInfo的所有属性方法来查找和设置某个ReflectPoint对象的x属性.
在程序中把一个类当做JavaBean来看,就是调用了IntroSpector.getBeanInfo方法,
得到的BeanInfo对象封装了把这个类当做JavaBean的结果信息.- //获取值
- private static Object getProperty(Object pt1, String propertyName)
- throws IntrospectionException, IllegalAccessException,
- InvocationTargetException {
- /*
- PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,pt1.getClass());
- Method methodGetX=pd1.getReadMethod();
- Object retVal = methodGetX.invoke(pt1);
- return retVal;
- */
- //比较复杂的方式
- BeanInfo beanInfor = Introspector.getBeanInfo(pt1.getClass());
- PropertyDescriptor[] pds = beanInfor.getPropertyDescriptors();
- Object retVal = null;
- for(PropertyDescriptor pd : pds)
- {
- if(pd.getName().equals(propertyName))
- {
- Method methodGetX = pd.getReadMethod();
- retVal = methodGetX.invoke(pt1);
- break;
- }
- }
- return retVal;
- }
复制代码 希望对楼主有用.
|