黑马程序员技术交流社区
标题:
我们为什么我用内省,他的作用是什么??
[打印本页]
作者:
江南雨
时间:
2013-6-12 15:05
标题:
我们为什么我用内省,他的作用是什么??
本帖最后由 江南雨 于 2013-6-12 20:23 编辑
看视频看不懂,知道是这么一回事,但是就是不知道它有什么用。能举个例子就最好了!!
作者:
许聪聪
时间:
2013-6-12 17:52
有点长,希望楼主能仔细观看
首先:内省,主要操作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;
}
复制代码
希望对楼主有用.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2