内省总结

/**
* 内省: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))
			{
                   Method getMethod = pd.getReadMethod();
                   retVal = getMethod.inovke(p);
                   System.out.println(retVal);

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);//反射调用 } }

  

posted @ 2015-04-18 18:42  蓝色T-shirt  阅读(166)  评论(0编辑  收藏  举报