JAVA内省JavaBean(Introspector、BeanInfo和PropertyDescriptor)


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 maps=new HashMap();
		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



你可能感兴趣的:(java学习)