java--内省

JavaBean

内省主要用于对JavaBean进行操作
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id。如果方法名为getId,中文意思即为获取id。去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
setId()的属性名id
isLast()的属性名last
setCPU的属性名是什么?CPU
getUPS的属性名是什么?UPS
总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!
好处:
在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作!
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。
内省访问JavaBean属性的两种方式:
一:通过PropertyDescriptor类操作Bean的属性。

二:通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后通过反射机制来调用这些方法。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.beans.*;
public class Test02 
{
	public static void main(String[] args) throws Exception 
	{
		method1();
		method2();
	}

	private static void method1() throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
		ReflectPoint pt1 = new ReflectPoint(3);
		String propertyName = "x";
		//"x"-->"X"-->"getX"-->MethodGetX-->
		PropertyDescriptor pd =new PropertyDescriptor(propertyName,pt1.getClass());//属性描述符
		Method methodGetX = pd.getReadMethod();
		Object retVal=methodGetX.invoke(pt1);
		System.out.println(retVal);
		
		Method methodSetX = pd.getWriteMethod();
		methodSetX.invoke(pt1,7);
		System.out.println(pt1.getX());
	}

	private static void method2() throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
		ReflectPoint pt1 = new ReflectPoint(3);
		String propertyName = "x";
		//"x"-->"X"-->"getX"-->MethodGetX-->

		BeanInfo beanInfo =  Introspector.getBeanInfo(pt1.getClass());
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		Object retVal = null;
		for(PropertyDescriptor pd : pds){
			if(pd.getName().equals(propertyName))
			{
				Method methodGetX = pd.getReadMethod();
				retVal = methodGetX.invoke(pt1);
				break;
			}
		}
		System.out.println(retVal);
	}
}
class ReflectPoint 
{
	private int x;
	public ReflectPoint(int x) {
		super();
		this.x = x;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
}

2,BeanUtils 

BeanUtils与PropertyUtils的相同点:
①、两个对象的同名方法的作用都是相同的。
②、使用时都要引入commons-beanutils.jar包
③、copy与被copy的两个对象的属性数量、名字可以不相同,但是set方法后的名字(字符串)要相同。
BeanUtis与PropertiesUtils的不同点:
①、当两个类中的同名(get后的名字)属性的类型不相同时,BeanUtils会自动转换,转换不过来则保留目标类中属性的原来值,如果原来没有值,则给一个对应类型的初始化值,而PropertyUtils对象则不会转换的。

②、PropertyUtils速度更快一些,而BeanUtils得速度比较慢


你可能感兴趣的:(java--内省)