1. 内省(Introspector)概念

    ​ 内省Introspector 是Java提供的操作 JavaBean 的 API,用来访问某个属性的 getter/setter 方法。对于一个标准的 JavaBean 来说,它包括属性、get 方法和 set 方法,这是一个约定俗成的规范。为此 sun 提供了 Introspector 工具包,来使开发者更好或者更灵活的操作 JavaBean。

    例如:User类中有个name属性,那我们可以通过getName/setName来获取/设置name的值,内省就是通过Java提供的API访问属性的getName()/setName()方法。

  2. 内省与反射的区别

    ​ 在计算机科学中,内省是指计算机程序在运行时(Run time)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查。 不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。

  3. 内省常用类说明

    • Introspector 类提供了的 getBeanInfo()方法获取BeanInfo对象,可以拿到一个 JavaBean 的所有信息
    • BeanInfo 通过getPropertyDescriptors() 方法和 getMethodDescriptors()方法可以获取到PropertyDescriptors、MethodDescriptors对象
    • MethodDescriptor 类可以获得方法的元信息,比如方法名,参数个数,参数字段类型等
      • getMethod()获取方法的Method对象
      • getParameters() 获取方法的所有参数Parameter列表
      • getParameterTypes()获取方法的参数ParameterType列表
    • PropertyDescriptor 类的主要方法
      • getPropertyType(),获得属性的Class对象
      • getReadMethod()/getWriteMethod(),获得用于读取/写入属性值的方法
        • setReadMethod(Method readMethod)/setWriteMethod(Method writeMethod),设置用于读取/写入属性值的方法
  4. 代码演示

    • MethodDescriptor 详解

      // 使用Introspector获取BeanInfo对象
      BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
      // 使用BeanInfo对象获取到MethodDescriptor列表
      MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
      for (MethodDescriptor methodDescriptor : methodDescriptors) {
      // 获取方法Method对象
      Method method = methodDescriptor.getMethod();
      // 获取方法名称
      String methodName = method.getName(); // 参数类型列表
      List<String> parameterTypeNames = new ArrayList<>();
      Class<?>[] parameterTypes = method.getParameterTypes();
      if (parameterTypes!=null && parameterTypes.length>0){
      Arrays.stream(parameterTypes).forEach(x-> {
      String name = x.getName();
      parameterTypeNames.add(name);
      });
      } // 获取方法参数Parameter数组
      Parameter[] parameters = method.getParameters();
      // 参数名称列表
      List<String> parameterNames = new ArrayList<>();
      if (parameters!=null && parameters.length>0){
      parameterNames = Arrays.stream(parameters).map(Parameter::getName).collect(Collectors.toList());
      } System.out.println("方法名称:"+methodName +" 参数类型列表:"+parameterTypeNames+" 参数名称列表:"+parameterNames);
    • PropertyDescriptors详解

      // 使用Introspector获取BeanInfo对象
      BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
      // 使用BeanInfo对象获取到PropertyDescriptor列表
      PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
      for (PropertyDescriptor propertyDescriptor :propertyDescriptors) {
      // 获取属性名称
      String name = propertyDescriptor.getName();
      if ("class".equals(name)){
      continue;
      }
      // 获取setter方法
      Method writeMethod = propertyDescriptor.getWriteMethod();
      // 获取getter方法
      Method readMethod = propertyDescriptor.getReadMethod();
      System.out.println("属性名称:"+name+
      " 赋值方法:"+writeMethod.getName()+
      " 获取方法:"+readMethod.getName());
      } // 利用反射创建对象
      User user = User.class.newInstance();
      // 创建PropertyDescriptor对象
      PropertyDescriptor propertyDescriptor = new PropertyDescriptor("name",User.class); // 获取写入方法并执行
      Method writeMethod = propertyDescriptor.getWriteMethod();
      writeMethod.invoke(user,"Rangers"); // 获取读取方法并执行
      Method readMethod = propertyDescriptor.getReadMethod();
      Object readPropertyValue = readMethod.invoke(user);
      System.out.println("ReadMethod获取到到属性值:"+readPropertyValue);
      System.out.println("getter获取到到属性值:"+user.getName()); // 设置写入方法并执行
      Method writeMd = User.class.getDeclaredMethod("setOoo",String.class);
      propertyDescriptor.setWriteMethod(writeMd);
      Method writeMethodAgain = propertyDescriptor.getWriteMethod();
      writeMethodAgain.invoke(user, "ooo");
      System.out.println("设置写入方法重新赋值:"+user.getName());

内省详解(Introspector/BeanInfo/MethodDescriptor/PropertyDescriptor)的更多相关文章

  1. Java内省详解

    内省和反射有什么区别: 反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态.  内省机制是通过反射来实现的,BeanIn ...

  2. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  3. Spring之IOC原理及代码详解

    一.什么是IOC 引用 Spring 官方原文:This chapter covers the Spring Framework implementation of the Inversion of ...

  4. 常见 jar包详解

        常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...

  5. MyBatis Generator 详解

    MyBatis Generator中文文档 MyBatis Generator中文文档地址:http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中 ...

  6. MyBatis Generator 详解 【转来纯为备忘】

    版权声明:版权归博主所有,转载请带上本文链接!联系方式:abel533@gmail.com   目录(?)[+] MyBatis Generator中文文档 运行MyBatis Generator X ...

  7. [转]application.properties详解 --springBoot配置文件

    本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ...

  8. application.properties详解 --springBoot配置文件【转载】

    # spring boot application.properties配置的各个属性详解 # 该示例文件作为标准提供.(官方文档 翻译过来的) # 还是花了些功夫翻译,各位如果转发,请留下本文地址, ...

  9. 类名.class 与 类名.this 详解

    类名.class 与 类名.this 详解 今天在看 PropertyPlaceholderConfigurer 源码时,突然看到一个 PropertyPlaceholderConfigurer.th ...

随机推荐

  1. 牛客编程巅峰赛S1第3场 - 青铜&白银 C.牛牛晾衣服(二分)

    题意:有\(n\)件衣服,每件衣服都有\(a_{i}\)滴水,所有衣服每分钟都能自然烘干\(1\)滴水,或者用烘干机,每分钟可以烘干\(k\)滴水,问最快多少分钟可以使所有衣服都烘干. 题解:这题和之 ...

  2. linux无需root挂载iso镜像文件

    引言 起初,我在针对deepin制作一款appimage安装工具,想要其实现的功能就是自动获取图标,只需要输入软件名称和分类即可,当然以后也会寻找方案省去手动输入的麻烦. 后来我发现一个有趣的问题 o ...

  3. HihoCoder1445 后缀自动机二·重复旋律5(后缀自动机 子串种数)

    题意: 询问串的不同子串个数 思路: 后缀自动机每个节点表示以当前字符结尾的一系列后缀,个数为\(maxlen - minlen\),其中\(minlen = maxlen[father]\). 代码 ...

  4. SpringBoot进阶教程(七十)SkyWalking

    流行的APM(Application Performance Management工具有很多,比如Cat.Zipkin.Pinpoint.SkyWalking.优秀的监控工具还有很多,其它比如还有za ...

  5. node.js cli downloader

    node.js cli downloader cli 下载器 refs https://github.com/xgqfrms/react-storybook-app xgqfrms 2012-2020 ...

  6. LeetCode 数组分割

    LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...

  7. Java IO 通信 All In One

    Java IO 通信 All In One Netty / WebSocket BIO 通信 BIO 即阻塞 I/O,不管是磁盘 I/O 还是网络 I/O,数据在写入 OutputStream 或者从 ...

  8. hackr.io & Programming Courses & Programming Tutorials

    hackr.io & Programming Courses & Programming Tutorials the Best Programming Courses & Tu ...

  9. how to create a ring progress bar in web skills

    how to create a ring progress bar in web skills ring progress bar & circle progress bar canvas j ...

  10. DENIEL SOIBIM:真正自律的人都在做这些事情!

    生活节奏的加快,使得很多人无法适从.很多人,浑浑噩噩,庸庸碌碌,觉得一天做了很多事,却总是一事无成.还有些人,觉得得过且过也很好,但是到头来,却让自己陷入慌乱之中.本想要自由自在的生活,但是却往往却被 ...