转自: https://blog.csdn.net/hahalzb/article/details/5972421

1.java内省机制其实通俗的理解为,对自身的进行一个扫描,这个扫描的对象就是我们普通的Bean类, 这个Bean类要求至少要有一个getXxx或者setXxx方法,内省的类是Instrospector, 通过传入Bean类的字节码文件,就可以获取到BeanInfo对象,这个对象中保存了这个Bean类的所有字节码信息,竟然保存在里面,那么我们就肯定可以通过某些方法来进行数据的获取,这个就是描述器(descriptor).

描述器有PropertyDescriptor, MethodDescriptor. 分别为属性描述器和方法描述器. 他们都有一个getName的方法来获取对应的名称(例:属性是name,  那么PropertyDescriptor.getName = "name",   对应的方法是getName,那么MethodDescriptor.getName = "getName,  这个getName方法非常常用,因为通过这个方法来确认描述器的). 每一个属性或者每一个方法都只有一个描述器, 所有只要找到对应的描述器,就可以通过描述器进行数据的存储等操作.

下面进行简单的代码演示

首先创建一个Bean类

  1. package cn.shampin.introspector.domain;
  2.  
  3. public class Point {
  4. private Integer x;
  5. private Integer y;
  6.  
  7. public Point(Integer x, Integer y) {
  8. // super();
  9. this.x = x;
  10. this.y = y;
  11. }
  12.  
  13. public Integer getX() {
  14. return x;
  15. }
  16.  
  17. public void setX(Integer x) {
  18. this.x = x;
  19. }
  20.  
  21. public Integer getY() {
  22. return y;
  23. }
  24.  
  25. public void setY(Integer y) {
  26. this.y = y;
  27. }
  28. }

创建一个测试类

  1. public static void main(String[] args) throws IllegalAccessException, IntrospectionException, InvocationTargetException {
  2. Point point = new Point(, );
  3.  
  4. /*getProperty(point,"x");*/
  5. getPropertyChange(point,"getX");
  6. setProperty(point,"x");
  7.  
  8. }

在测试类中创建测试方法

第一个是setProperty

  1. //创建一个setProperty方法
  2. private static void setProperty(Point point, String proName) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
  3. //通过属性描述器PropertyDescriptor,来访问属性的getter/setter方法
  4. //参数为属性名称和javaBean字节码,获取该属性的描述器
  5. PropertyDescriptor descriptor = new PropertyDescriptor(proName, Point.class);
  6. System.out.println(descriptor);
  7. //通过描述器的getWriteMethod就是获取 setXxxx方法反射实例,可以进行方法的设置
  8. Method writeMethod = descriptor.getWriteMethod();
  9. System.out.println(writeMethod);
  10. //反射实例调用invoke方法,实现方法的调用
  11. writeMethod.invoke(point, );
  12. System.out.println(point.getX()); //
  13. }

第二个是getProperty

  1. //创建一个getProperty方法
  2. private static void getProperty(Point point, String proName) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
  3. PropertyDescriptor descriptor = new PropertyDescriptor(proName,Point.class);
  4. Method readMethod = descriptor.getReadMethod();
  5. Object invoke = readMethod.invoke(point);
  6. System.out.println(invoke); //
  7. }

第三个是通过Introspector内省类

  1. //创建一个getProperty修改方法
  2. private static void getPropertyChange(Point point, String proName) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
  3. //通过类或者类的对象来获取当前类BeanInfo对象是同一个
  4. //BeanInfo beanInfo = Introspector.getBeanInfo(Point.class);
  5. //Introspetor就是内省
  6. BeanInfo beanInfo = Introspector.getBeanInfo(point.getClass());
  7. //获取当前BeanInfo对象的所有属性描述器,一个属性只有一个属性描述器,里面存储着当前属性的所有信息
  8. //包括属性名称,属性数据类型,属性get/set方法
  9. //Introspector 是一个专门处理bean的工具类.用来获取Bean体系里的 propertiesDescriptor,methodDescriptor.
  10. //利用反射获取Method信息,是反射的上层.
  11. PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
  12. for (PropertyDescriptor prop : propertyDescriptors) {
  13. /*System.out.println("getName:" + prop.getName()); //JavaBean属性名称
  14. System.out.println("propertyType" + prop.getPropertyType()); //属性数据类型
  15. System.out.println("propertyEC" + prop.getPropertyEditorClass()); //属性编辑器*/
  16. //通过比对属性的名称,来寻找我们传入的属性proName的属性描述器
  17. //通过属性描述器来对该属性进行相关的操作
  18. Method readMethod = prop.getReadMethod();
  19. if(readMethod.getName().equals(proName)){
  20. Method methodGetx = prop.getReadMethod();
  21. System.out.println(methodGetx.invoke(point)); //
  22. break;
  23. }
  24. }

对内省的实际应用工具是BeanUtils, 这是Web项目中,通过populate,实现将前台获取的数据直接封装到JavaBean中

类似的工具还有PropertyUtils, 两者的区别在于:BeanUtils获取的属性值的类型全部转为String类型,而PropertyUtils则是保留原有的数据类型.

Java内省机制的更多相关文章

  1. java内省机制及PropertyUtils使用方法

    背景 一般情况下,在Java中你可以通过get方法轻松获取beans中的属性值.但是,当你事先不知道beans的类型或者将要访问或修改的属性名时,该怎么办?Java语言中提供了一些像java.bean ...

  2. java内省机制Introspector

    访问JavaBean属性的两种方式 1)直接调用bean的setXXX或getXXX方法: 2)通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式: a)通过P ...

  3. Java 内省机制

    一.内省 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法.JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的 ...

  4. 就改了get,却不让我set?——Java内省机制的神奇行为举止一例

    [相关类库]org.apache.commons.beanutils.BeanUtils,提供对Java反射和自省API的包装,其中底层使用到了Java的内省方法.[内省的一般应用形式]通过类Intr ...

  5. Java的内省机制

    我现在的理解就是,Java的内省机制就是针对JavaBean的,可以获取到类的属性名称,以及属性的Getter和Setter方法,应该是在写框架的时候才会用到内省机制,还有一个地方可以用到内省机制,就 ...

  6. 01-Introspector内省机制

    在java领域编程中,内省机制相当的不错,可以省去我们程序员很多的不必要的代码 比如说:在jdbc工具类 我们可以将ResultSet结果集待到 javabean对象中 将http请求报文的数据 转换 ...

  7. 【小家Spring】Spring IoC是如何使用BeanWrapper和Java内省结合起来给Bean属性赋值的

    #### 每篇一句 > 具备了技术深度,遇到问题可以快速定位并从根本上解决.有了技术深度之后,学习其它技术可以更快,再深入其它技术也就不会害怕 #### 相关阅读 [[小家Spring]聊聊Sp ...

  8. Java基础扫盲系列(三)— Java内省技术

    前言 Java内省技术属于Java基础体系的的一部分,但是很多人都不甚了解.笔者也是在学习Spring源码的过程中遇到该技术模块的.为了完善技术体系,本文将全面的学习该技术.在提到Java内省技术,就 ...

  9. JDK 之 Java Bean 内省机制

    JDK 之 Java Bean 内省机制 JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html) JavaBean 是一种特殊的 Jav ...

随机推荐

  1. laravel5.5首次使用php artisan migrate注意问题:

    1.在app/Providers/AppServiceProvider.php中设置字符串默认长度:(不进行这一步,执行php artisan migrate会报错,同时创建的表会有所缺失) use ...

  2. apk文件二维码微信无法识别 APP在微信中二维码扫描无法下载的解决方案

    现在微信分享的功能很多,从分享的链接下载apk安卓包是很正常的,但是微信不让下载apk包,只能通过浏览器来下载,但是这要给用户一个提示吧,不然用户不知道 下面我们来实现,引导用户通过浏览器来下载apk ...

  3. bzoj4700

    题解: cdq分治 先考虑没有人被秒掉的情况 代码: #include<bits/stdc++.h> #define y1 ____y1 ; using namespace std; ty ...

  4. Spring使用ioc注解方式配置bean

    context层 : 上下文环境/容器环境 applicationContext.xml 具体示例: 现在ioc容器中添加context层支持: 包括添加xmlns:context.xsi:schem ...

  5. IDEA中项目编码格式设置

    自从换成IntelliJ IDEA 之后各种设置就成了问题,这不,在跟另一家公司做对接的时候,他们说我这边的http接口返回的都是乱码, 所有的接口我这边的都是访问过的,这个怎么会,我用360浏览器和 ...

  6. 搭建SSH框架心得

    <Struts2+Spring4+hibernate3> 工程结构 导入相关jar包:自行网上百度即可,根据环境需要 写dao类 以及实现 package com.icommon.dao; ...

  7. CXF 简单创建Webserver 例子

    最近在弄webserver,因为公司需要用到,来说说,webserver的常用方式吧 1.什么是webservice 1.1   什么是远程调用技术 远程调用数据定义:是系统和系统之间的调用 先说一说 ...

  8. LeetCode 145 二叉树的后序遍历(非递归)

    题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1 ...

  9. servlet中常用到的工具

    1. 解析ajax传来的json字符串,得到json对象 private JSONObject getJsonObject(HttpServletRequest req) { StringBuffer ...

  10. Qt笔记之Q_DECLARE_METATYPE(Type)

    首先看一看QVariant这个类,我们可以把它当做一个万能数据类型,需要的时候能转换为一种特定的类型. 使用canConvert()函数检查是否能转换为你想要的数据类型,结构为:bool QVaria ...