Java内省机制

反射与内省的区别

 反射是在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。 

 内省(IntroSpector)是Java 语言对 Bean 类属性、事件的一种缺省处理方法。 

内省是与反射类似的技术,它是以规范化的Java bean为模板,将类中的成员变量和getter、setter方法关联起来 
它的一般用法是: 
使用Java反射解析Java类的结构,把字段和该字段对应的setter、getter方法关联起来,封装到PropertyDescriptor(属性描述器)中。通过属性描述器可以直接获得该字段的setter、getter方法的Method对象,进而根据实际需要进行操作。

JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性。

在Java内省中,用到的基本上就是上述BeanInfo 、Introspector 、PropertyDescriptor这三个类。

JDK内省类库

java.beans.Introspector:Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
java.beans.BeanInfo接口:希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类,该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。
java.beans.PropertyDescriptor:PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。

通过BeanInfo这个类就可以获取到类中的方法和属性。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中,一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法,这就是内省机制。

实例如下:

public static void main(String[] args) {
    User oldBo=new User();
    oldBo.setContractCode("XKJ");
    oldBo.setId(7L);
    User newBo=new User();
    newBo.setContractCode("XKJnew");
    newBo.setId(8L);
    try{
        PropertyDescriptor[] pds = Introspector.getBeanInfo(User.class).getPropertyDescriptors();
        for (PropertyDescriptor pd : pds) {
           // System.out.println(pd.getName());获取属性名
           // System.out.println(pd.getReadMethod());获取get方法
            // System.out.println(pd.getWriteMethod());获取set方法
            String name=pd.getName();
            Method readMethod=pd.getReadMethod();
            Object oldValue = readMethod.invoke(oldBo);//执行oldBo类里的get方法
            Object newValue = readMethod.invoke(newBo);//执行newBo类里的get方法

        }
    }catch (Exception e){
        //logger
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值