转自: 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类

package cn.shampin.introspector.domain;

public class Point {
private Integer x;
private Integer y; public Point(Integer x, Integer y) {
// super();
this.x = x;
this.y = y;
} public Integer getX() {
return x;
} public void setX(Integer x) {
this.x = x;
} public Integer getY() {
return y;
} public void setY(Integer y) {
this.y = y;
}
}

创建一个测试类

public static void main(String[] args) throws IllegalAccessException, IntrospectionException, InvocationTargetException {
Point point = new Point(, ); /*getProperty(point,"x");*/
getPropertyChange(point,"getX");
setProperty(point,"x"); }

在测试类中创建测试方法

第一个是setProperty

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

第二个是getProperty

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

第三个是通过Introspector内省类

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

对内省的实际应用工具是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. c# 使用Renci.SshNet.dll操作SFTP总结

    1.操作类 /// <summary> /// SFTP操作类 /// </summary> public class SFTPHelper { #region 字段或属性 p ...

  2. 面试北京XX数通总结

    软件架构师何志丹 1             总括 1.1     面试时间 2019年1月21号. 1.2     公司概况 员工近20人,其中开发人员6人,全部objectarx(C++),全部老 ...

  3. 发现sql注入的一些技巧

    1.如果一个'导致错误,试着查看\'能否成功(因为反斜杠在MySQL中取消了单引号)2.你也可以尝试注释掉,--',看页面返回是否正常.3.如果正常的输入只是一个整数,你可以尝试减去一些量,然后查看减 ...

  4. 关于ijkplayer下载的demo不能运行,这是因为FFmpeg

    前提是你在Mac上已经配置了 homebrew 包管理工具 关于ijkPlayer的demo和framework的使用,也许当直接下载下来不能使用,这时候你需要再你下载的当前目录下运行,你看下自己的目 ...

  5. wifi编辑 centos

    ifconfig -a sudo iw dev 设置名称 scan

  6. adaboost 参数选择

    先看下ababoost和决策树效果对比 import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection ...

  7. 安装webstrom2019

    破解webstrom2019 下载地址:https://www.jetbrains.com/webstorm/ 下载安装后进行破解(安装基本上是傻瓜样式的) 可以在线进入  http://idea.l ...

  8. day04 list tuple

    一. 上节课内容回顾 字符串 由', ", ''', """括起来的内容是字符串 字符:单一文字符号. 字符串: 把字符连成串(有顺序的) 索引和切片 s[st ...

  9. IP通信基础课堂笔记----第四章(重点中的重点)

    IPv4编址方法 一个IPv4地址可表示为一个32位的二进制数. IP地址前面的网络部分表示一个网段,后面部分(主机位)表示这个网段上的一台设备. 常用IP地址分为四类:A.B.C.D. 每类的网络地 ...

  10. input()和print()函数同时输入输出多个数据--python3

    使用input()和print()函数同时输入输出多个数据,需要空格分割输入信息 #!/usr/bin/python3#-*- conding:utf-8 -*- name, age, QQ = in ...