Java内省机制
转自: 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内省机制的更多相关文章
- java内省机制及PropertyUtils使用方法
背景 一般情况下,在Java中你可以通过get方法轻松获取beans中的属性值.但是,当你事先不知道beans的类型或者将要访问或修改的属性名时,该怎么办?Java语言中提供了一些像java.bean ...
- java内省机制Introspector
访问JavaBean属性的两种方式 1)直接调用bean的setXXX或getXXX方法: 2)通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式: a)通过P ...
- Java 内省机制
一.内省 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法.JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的 ...
- 就改了get,却不让我set?——Java内省机制的神奇行为举止一例
[相关类库]org.apache.commons.beanutils.BeanUtils,提供对Java反射和自省API的包装,其中底层使用到了Java的内省方法.[内省的一般应用形式]通过类Intr ...
- Java的内省机制
我现在的理解就是,Java的内省机制就是针对JavaBean的,可以获取到类的属性名称,以及属性的Getter和Setter方法,应该是在写框架的时候才会用到内省机制,还有一个地方可以用到内省机制,就 ...
- 01-Introspector内省机制
在java领域编程中,内省机制相当的不错,可以省去我们程序员很多的不必要的代码 比如说:在jdbc工具类 我们可以将ResultSet结果集待到 javabean对象中 将http请求报文的数据 转换 ...
- 【小家Spring】Spring IoC是如何使用BeanWrapper和Java内省结合起来给Bean属性赋值的
#### 每篇一句 > 具备了技术深度,遇到问题可以快速定位并从根本上解决.有了技术深度之后,学习其它技术可以更快,再深入其它技术也就不会害怕 #### 相关阅读 [[小家Spring]聊聊Sp ...
- Java基础扫盲系列(三)— Java内省技术
前言 Java内省技术属于Java基础体系的的一部分,但是很多人都不甚了解.笔者也是在学习Spring源码的过程中遇到该技术模块的.为了完善技术体系,本文将全面的学习该技术.在提到Java内省技术,就 ...
- JDK 之 Java Bean 内省机制
JDK 之 Java Bean 内省机制 JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html) JavaBean 是一种特殊的 Jav ...
随机推荐
- laravel5.5首次使用php artisan migrate注意问题:
1.在app/Providers/AppServiceProvider.php中设置字符串默认长度:(不进行这一步,执行php artisan migrate会报错,同时创建的表会有所缺失) use ...
- apk文件二维码微信无法识别 APP在微信中二维码扫描无法下载的解决方案
现在微信分享的功能很多,从分享的链接下载apk安卓包是很正常的,但是微信不让下载apk包,只能通过浏览器来下载,但是这要给用户一个提示吧,不然用户不知道 下面我们来实现,引导用户通过浏览器来下载apk ...
- bzoj4700
题解: cdq分治 先考虑没有人被秒掉的情况 代码: #include<bits/stdc++.h> #define y1 ____y1 ; using namespace std; ty ...
- Spring使用ioc注解方式配置bean
context层 : 上下文环境/容器环境 applicationContext.xml 具体示例: 现在ioc容器中添加context层支持: 包括添加xmlns:context.xsi:schem ...
- IDEA中项目编码格式设置
自从换成IntelliJ IDEA 之后各种设置就成了问题,这不,在跟另一家公司做对接的时候,他们说我这边的http接口返回的都是乱码, 所有的接口我这边的都是访问过的,这个怎么会,我用360浏览器和 ...
- 搭建SSH框架心得
<Struts2+Spring4+hibernate3> 工程结构 导入相关jar包:自行网上百度即可,根据环境需要 写dao类 以及实现 package com.icommon.dao; ...
- CXF 简单创建Webserver 例子
最近在弄webserver,因为公司需要用到,来说说,webserver的常用方式吧 1.什么是webservice 1.1 什么是远程调用技术 远程调用数据定义:是系统和系统之间的调用 先说一说 ...
- LeetCode 145 二叉树的后序遍历(非递归)
题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1 ...
- servlet中常用到的工具
1. 解析ajax传来的json字符串,得到json对象 private JSONObject getJsonObject(HttpServletRequest req) { StringBuffer ...
- Qt笔记之Q_DECLARE_METATYPE(Type)
首先看一看QVariant这个类,我们可以把它当做一个万能数据类型,需要的时候能转换为一种特定的类型. 使用canConvert()函数检查是否能转换为你想要的数据类型,结构为:bool QVaria ...