您的位置:首页 > 编程语言 > Java开发

JAVA内省JavaBean(Introspector、BeanInfo和PropertyDescriptor)

2012-12-06 20:24 399 查看
JavaBean是一个特殊的java类,主要用于传递数据信息

(在我的博客 android之SQLite项目分析中提到绘制表格时将读取数据库的数据写到了

一个Information类中一样,就是用到了利用javabean来存储数据的作用)

这种java类中的方法主要用于访问私有的字段

且方法名符合某种命名规则,下面看一个例子分析

第一步:先写个javabean类

public class Student {
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}


第二步:写个测试类

public class StudentTest {

public static void main(String[] args)throws Exception
{
//method_1();
//method_2();
//method_3();
//method_4();
method_5();
}
/*
* (1)设置javabean有两种方式,这是第一种方式:
*
* 当你写好一个javabean类后,编译成.calss类后给别人用,这时别人根本不知道你的这个类有什么属性
* 这时就可以用这种方式了。
* 首先得到javabean中所有属性的描述,先调用Introspector类中的getBeanInfo()方法来获得BeanInfo的对象
* 然后由此对象调用getPropertyDescriptor()方法来获得javabean中所有属性的描述,并将它们存到一个数组中
* ,这样就可以遍历这个数组,判断以后就可以得到需要的那个属性了,看代码:
* */
private static void method_1()throws Exception
{
//利用反射的方式得到Student类的一个对象
Student ss=Student.class.newInstance();
//得到BeanInfo对象。getBeanInfo()中的参数必须指定,你要获得谁的BeanInfo,就传入谁的字节码
BeanInfo beanInfo=Introspector.getBeanInfo(Student.class);
//获得JavaBean中所以的属性,这里我们还不知道Student类这个javabean中到底有什么属性
PropertyDescriptor[] proDesptors=beanInfo.getPropertyDescriptors();
//好了这里就可以遍历了
for(PropertyDescriptor p:proDesptors)
{
//为了知道都与哪些属性,这里可以先打印在控制台看看
System.out.println(p.getName());
/*
* 上面打印的属性信息下面就有用了,我们可以根据打印的属性名,做选择我们需要哪些属性
* 例如想获得的属性名和name一样
*
* */
if(p.getName().equals("name"))
{
//这里就获得了我们要找的属性了,然后再通过反射的方式获取该属性的get和set方法
Method getMethod=p.getReadMethod();//获得get方法
Method setMethod=p.getWriteMethod();//获得set方法
//然后调用获得的set方法来设置属性的值
setMethod.invoke(ss, "张三");
//设置好后就上面获得的getMethod方法来查看值是否设置成功
//下面两种方法都行,因为get方法并不需要传入参数,所以可以是null或者不写
//System.out.println(getMethod.invoke(ss));
System.out.println(getMethod.invoke(ss,null));
}
}
}

/*
* 这时第二种方式
* 如果你把写好的javabean类,连.java都给别人的话,那么别人就很清楚这个javabean类中的具体属性了(例如age)
* 那么这时就可以通过属性描述器Descriptor来直接获取
* */
public static void method_2()throws Exception
{
//利用反射的方式得到Student类的一个对象
Student ss=Student.class.newInstance();
//然后我们就可以得到需要设置的某个属性(例如age)的属性描述器
//参数分别是:属性,哪个类,即需要设置哪个类的哪个属性
PropertyDescriptor pd=new PropertyDescriptor("age", Student.class);
Method setMethod=pd.getWriteMethod();
Method getMethod=pd.getReadMethod();
setMethod.invoke(ss, 23);
System.out.println(getMethod.invoke(ss));
}

/*
* 操作javabean类,其实不用这么麻烦,我们可以直接使用BeanUtils工具包
* 使用BeanUtils工具包时,需要两个包commons-beanutils-1.8.3.jar、commons-logging-1.1.1.jar,看下工程目录(见图1):
* 这个类中常用的类:BeanUtils、PropertyUtils、ConverUtils
* */
public static void method_3()throws Exception
{
Student ss=new Student();
BeanUtils.setProperty(ss, "name", "王五");
BeanUtils.setProperty(ss, "age", 23);
System.out.println(ss.getName());
System.out.println(ss.getAge());
}

/*
* 我们可以这样的想象下,一个类的属性,它有属性名和属性值,刚好存在一个映射关系,那么我们就可以
* 讲这些信息存放到一个Map集合当中了
* */
public static void method_4()throws Exception
{
Student ss=new Student();
Map<String,String> maps=new HashMap<String, String>();
maps.put("name", "水淼淼");
maps.put("age", "12");
//下面调用BeanUtils中的populate方法来设置值,参数分别是:
//哪个对象设置值,存放键值的集合
BeanUtils.populate(ss, maps);
System.out.println(ss.getAge());
System.out.println(ss.getName());
}
/*
* PropertyUtils
* */
public static void method_5()throws Exception
{
Student ss=new Student();
PropertyUtils.setProperty(ss, "name", "水白白");
PropertyUtils.setProperty(ss, "age", 89);
System.out.println(ss.getName());
System.out.println(ss.getAge());
}
}


图1

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: