目录
1.内省机制
-
在实际编程中,我们常常需要一些用来包装值对象的类,例如Student、Employee、Order,这些类中往往没有业务方法,只是为了把需要处理的实体对象进行封装,有这样的特征:
-
属性都是私有的;
-
有无参的public构造方法;
-
对私有属性根据需要提供公有的getXxx方法以及setXxx方法;例如属性名称为name,则有getName方法返回属性name值,setName方法设置name值;注意方法的名称通常是get或set加上属性名称,并把属性名称的首字母大写;这些方法称为getters/setters;getters必须有返回值没有方法参数;setter值没有返回值,有方法参数;
-
-
符合这些特征的类,被称为JavaBean;
-
内省(Inspector)机制就是基于反射的基础,Java语言对Bean类属性、事件的一种缺省处理方法。
-
只要类中有getXXX方法,或者setXXX方法,或者同时有getXXX及setXXX方法,其中getXXX方法没有方法参数,有返回值;setXXX方法没有返回值,有一个方法参数;那么内省机制就认为XXX为一个属性;
-
与Java内省有关的主要类及接口有:
-
java.beans.Introspector类: 为获得JavaBean属性、事件、方法提供了标准方法;通常使用其中的getBeanInfo方法返回BeanInfo对象;
-
Java.beans.BeanInfo接口:不能直接实例化,通常通过Introspector类返回该类型对象,提供了返回属性描述符对象(PropertyDescriptor)、方法描述符对象(MethodDescriptor) 、bean描述符(BeanDescriptor)对象的方法;
-
Java.beans.PropertyDescriptor类:用来描述一个属性,该属性有getter及setter方法;
-
2.内省机制对于属性的操作
-
可以使用PropertyDescriptor类的方法获取属性相关的信息,例如getName方法返回属性的名字:
-
PropertyDescriptor类中定义了方法可以获取该属性的getter和setter方法:
-
案例
//在上篇(反射)的Person类中添加一个方法 public int getScore(){ return 11; }
import com.bx.reflect.Person; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class IntrospectorTest { public static void main(String[] args) throws IntrospectionException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //Introspector内省类 静态方法getBeanInfo获取对应类的BeanInfo对象 BeanInfo beanInfoPerson = Introspector.getBeanInfo(Person.class); //PropertyDescriptor定义属性类 //获取Person所有属性,使用BeanInfo返回PropertyDescriptor对象数组 PropertyDescriptor[] propertyDescriptors = beanInfoPerson.getPrope