内省(Introspector)是专门用来操作JavaBean属性的。不是所有的字段(Field)都能被称之为属性,只有某些字段具有getXXX或setXXX方法的才能称之为属性,当然要称为是一个Bean还需要有一个无参的构造器,而内省就是对这些属性进行操作。

  我们先来看一个例子来数一数Javabean的属性:

 public class Person {
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 String getAbc() {
return null;
}
}

  这里面一共有多少属性呢?

  答案是4个,除了两个私有字段提供了get或set 方法成为了这个类的属性之外,还有外加的一个getXXX(那么属性为xXX),最后还有一个从Object类中继承的getClass方法(属性为class),所以Person中含有4个属性。

  回归到内省,当然仅仅操作是属性,可以按操作字段一样采用反射,但是采用内省会更加专业。

  在JavaAPI中有专门的一个类封装了内省的操作,这个类就是Introspector类,通过getBeanInfo(…)方法就可以将某个类中的属性封装到一个BeanInfo类中。

  取得BeanInfo对象后就相当于取得某个类的所有属性,那么再调用BeanInfo对象中的getPropertyDescriptors()方法获得PropertyDescriptor[]数组对象,每个数组中的元素都是PropertyDescriptor实例(属性描述器),而PropertyDescriptor实例封装了每个属性特有的一些性质,比如调用getReadMethod()方法就能获得这个属性的get方法Method,调用getWriteMethod()方法就能获得这个属性的set方法Method。

  通过一段简单的代码来测试一下刚才Person这个bean对象到底有多少个属性:

 Person p = new Person();
BeanInfo beanInfo = Introspector.getBeanInfo(p.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds) {
System.out.println(pd.getName());
}

控制台观察:

  

可以看到确实是有4个属性。

  如果我们不想有父类继承的某些get或set方法而继承下来的属性,比如上述的class,那么我们在最开始使用Introspector. getBeanInfo时可以使用对应的参数列表:

当然这个方法也可以不需要某一级以上的父类属性,非常灵活。

  如果想直接操作一个bean的某个具体属性,那么其实我们可以直接使用属性描述器PropertyDescriptor的构造函数:

  

比如我想操作上述Person类的age属性:

   PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
  Person p = new Person();
  Method setAgeMethod = pd.getWriteMethod();
  setAgeMethod.invoke(p,25);
  Method getAgeMethod = pd.getReadMethod();
  System.out.println(getAgeMethod.invoke(p, null));

输出:25

  当然,获得某个属性的属性描述器(PropertyDescriptor),调用getPropertyType方法还能知道该属性的类型:

   PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
  System.out.println(pd.getPropertyType());

输出:

  

内省(一)之Introspector、BeanInfo、PropertyDescriptor的更多相关文章

  1. 内省详解(Introspector/BeanInfo/MethodDescriptor/PropertyDescriptor)

    内省(Introspector)概念 ​ 内省Introspector 是Java提供的操作 JavaBean 的 API,用来访问某个属性的 getter/setter 方法.对于一个标准的 Jav ...

  2. 【小家Spring】聊聊Spring中的数据绑定 --- BeanWrapper以及内省Introspector和PropertyDescriptor

    #### 每篇一句 > 千古以来要饭的没有要早饭的,知道为什么吗? #### 相关阅读 [[小家Spring]聊聊Spring中的数据转换:Converter.ConversionService ...

  3. 深入理解Java:内省(Introspector)

    深入理解Java:内省(Introspector) 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传 ...

  4. java 内省(Introspector)

    开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性. 当然你也可以用反射来操作JavaB ...

  5. Java 内省(Introspector)深入理解

    Java 内省(Introspector)深入理解 一些概念: 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类 ...

  6. java 如何将实体bean和map互转化 (利用Introspector内省)

    // 将一个map对象转化为bean public static void transMap2Bean(Map<String, Object> map, Object obj) { try ...

  7. (转载)深入理解Java:内省(Introspector)

    本文转载自:https://www.cnblogs.com/peida/archive/2013/06/03/3090842.html 一些概念: 内省(Introspector) 是Java 语言对 ...

  8. Java核心_内省

    Java核心_内省 查看java的api,发现有一个包java.bean咦,这个包是干什么的呢,原来,它是用来操作JavaBean对象的! 一.内省操作①JavaBean:一种特殊的Java类无参构造 ...

  9. 内省与JavaBean

    概述 JavaBean代表一类特殊的Java类,这种类主要用来存储和传递属性信息,JavaBean中的方法主要用于设置和获取这些私有属性,他们有一定的命名规则,我们可以把它们想象为一个侧重属性信息的类 ...

随机推荐

  1. PHP学习笔记4-类/命名空间/成员方法/类方法

    命名空间 namespace   类 class创建文件Hello.php,namespace是jikexueyuan: <?php /** * Created by PhpStorm. * U ...

  2. Python 模块(五)

    目录 模块介绍 time &datetime模块 random json & picle 一.模块介绍 在我们日常的程序开发过程中,随着代码越写越多,在单个文件里的代码就会越来越长,越 ...

  3. Delphi语言最好的JSON代码库 mORMot学习笔记1

    mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...

  4. nginx使用小记

    中文wiki社区:http://wiki.codemongers.com/NginxChs 一 . nginx安装 1. 下载nginx : http://sysoev.ru/nginx/downlo ...

  5. 如何抓取Thread Dump小结(转)

    当系统性能出现问题时,需要从各个方面来查看网络环境.主机资源.查看最经变更的代码等.如果是想从代码层面解决问题,那么最有效的方法就是查看相关dump文件.如果是使用IBM JDK(我默认你是在aix环 ...

  6. zookeeper perl 版本需求

    [root@wx03 ~]# perl -v This is perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux Cop ...

  7. linux mount挂载设备(u盘,光盘,iso等 )使用说明

    对于新手学习,mount 命令,一定会有很多疑问.其实我想疑问来源更多的是对linux系统本身特殊性了解问题. linux是基于文件系统,所有的设备都会对应于:/dev/下面的设备.如: [cheng ...

  8. “快的打车”创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - V2EX

    "快的打车"创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - ...

  9. A2DP和AVRCP蓝牙音频传输协议的应用解释

    A2DP全名是Advenced Audio Distribution Profile 蓝牙音频传输模型拹定.A2DP 规定了使用蓝牙非同步传输信道方式,传输高质量音乐文件数据的拹议堆栈软件和使用方法, ...

  10. 如何实现android蓝牙开发 自动配对连接,并不弹出提示框

    之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对. 上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了 我就 ...