标签:
/**
* 内省:Introspector ,主要用于对javaBean进行操作,是JDK为操作javaBean提供的一整套API。
* 内省就是对javaBean类进行内部检查,检查出它到底有那些javaBean属性,公共方法等信息。
*
* 什么是javaBean?
* javaBean 是一个特殊的java类,是一个类中的某些方法需要符合某些规则的类。
* 这些规则就是:必须有一些以set和get打头的方法,比如:setXXX,getXXX。对于属性
* 并没有什么硬性的要求,大家约定的一般写法,就是成员变量都是私有的,get和set方法是公共的
*
* javaBean的作用:JavaBean应用非常广泛,尤其是在J2EE中,一般可以被用作软件的模块与模块之间的
* 信息传递,所以,这类javaBean对象又被成为值对象(即Value Object),值对象,顾名思义,就是以传递值为目标的对象,
* 对象中属性比较多,方法很少。主要就是为了传递这些字段。
*
* javaBean和普通的java类的关系:一个javaBean可以被当成为普通的java类来进行操作,一个java类也可以被当做javaBean来看待
* (包括那些类中没有get,set大头的方法的类,也可以被看成javaBean,只不过这个javaBean中没有任何属性)
*
* javaBean的属性:javaBean的属性不同于类的成员变量(类的属性),javaBean的属性的名称是以方法名的后缀来确定的,javaBean
* 的属性可以看成是get和set方法以及在外部看不到的私有成员变量的封装体。这个封装体有众多的信息,
* 用java.beans.PropertyDescriptor类来进行描述,其中就包括属性名这个信息。
* javaBean的属性名就是去掉开头的set,get,然后对剩余的部分,如果剩余部分的第二个字母不存在,或者存在且为小写字母
* ,就将开头的字母转成小写。否则,保持开头字母原样。javaBean的属性可以理解为在外部的人看起来,这个Bean应该有的
* 一个属性。
*
* javaBean的好处之一就是可以用内省的这套API来操作它,为开发节省了很多事情,更方便了
*
* 内省的API :Introspector类、BeanInfo类、PropertyDescriptor类,内省技术用到了反射技术
*
* BeanInfo类:用来描述将一个类看成是javaBean后,这个javaBean应该具有的信息。即这个类的对象中存储了一个java类被看成
* javaBean后所具有的所有细节信息。
*
*/
package cn.itcast.day25;
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;
//定义一个javaBean
class Person
{
private int age ;
private String name ;
Person(int age ,String name)
{
this.age = age ;
this.name = name ;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class IntroSpectorTest {
public static void main(String[] args)throws Exception {
Person p = new Person(12,"lbx");
String propertyName1 = "age" ;
String propertyName2 = "name";
Object retVal = null;
Object value = "plj";
int flag = 0;
//较为复杂的内省使用方式
BeanInfo beanInfo = Introspector.getBeanInfo(p.getClass());//获得javaBean的BeanInfo对象
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//获得这个javaBean的所有属性
for(PropertyDescriptor pd : pds)
{
if(pd.getName().equals(propertyName1))
{
retVal = getProperty(p,propertyName1); //抽取封装方法后的代码
System.out.println(retVal);
if(++flag == 2)
break;
}
else if(pd.getName().equals(propertyName2))
{
retVal = getProperty(p, propertyName2);//抽取封装方法后的代码
System.out.println(retVal);
setProperty(p, propertyName2, value);
if(++flag == 2)
break;
}
}
System.out.println(p.getName());
//简便写法,内省的简单应用
value = 15 ;
setProperty(p, propertyName1, value);
retVal = getProperty(p, propertyName1);
System.out.println(retVal);
}
//抽取出的获得javaBean属性值的方法
private static Object getProperty(Person p, String propertyName1)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
Object retVal;
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName1, p.getClass()); //获得属性描述对象
Method getMethod = pd2.getReadMethod();//获得javaBean属性的get方法
retVal = getMethod.invoke(p);//反射调用
return retVal;
}
//抽取出的设置javaBean属性值的方法
private static void setProperty(Person p, String propertyName1, Object value)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pd = new PropertyDescriptor(propertyName1, p.getClass());//获得属性描述对象
Method setMethod = pd.getWriteMethod();//获得javaBean属性的set方法
setMethod.invoke(p, value);//反射调用
}
}
标签:
原文地址:http://www.cnblogs.com/wllbelief-win/p/4437854.html