Introspector 是一个专门处理bean的工具类.用来获取Bean体系里的 propertiesDescriptor,methodDescriptor.

要理解这个,就要理解下面几个议题.

 
*bean是啥?

     普通的class 可能有 computerAges(){ }等方法.
    Bean是 一个field ,有 get 或者set. 除了这些别无其他.
     bean是class的一种
    例如 public class People {
            String name;
            public String getName(){
            }
            public void setName(String name){
            }
        }
*Bean在jdk里对应的的概念
     BeanInfo , 他包含了Bean所有的descriptor(描述符) .
          BeanDescriptor PropertiesDescriptor MethodDescriptor
 
*  一个类的属性field 和 propertiesDescriptor(描述)有什么区别.

   propertiesDescriptor,它来至于 对Method的解析.
    如果是严格的Bean.例如上面的People. field一个叫做name, propertiesDescriptor 只有一个,刚好也是name, 来自set和get的解析, 解析出来都是       name.,所有两个merge为一个. 
  
 
详细逻辑见Introspector中代码.见附件
 
*  反射的method和bean概念体系里的methodDescriptor的区别
      2:1的对应关系. People里有set和get两个方法,反射得到两个Method,但这两个method会组合成一个MethodDescriptor. 
 
*  Introspector内省 和 反射的区别和关系?
    Introspector 是一个专门处理bean的工具类.用来获取Bean体系里的 propertiesDescriptor,methodDescriptor.
    利用反射获取Method信息,是反射的上层. 
    性能优化: 只进行一次反射解析. 通过WeakReference静态类级别缓存Method, 在jvm不够时会被回收.  
        // Static Caches to speed up introspection.
    private static Map declaredMethodCache = Collections.synchronizedMap(new WeakHashMap());
 
 
附件1:
解析method得到properties,并且合并同名的properties.
把 method根据 解析出的properties放入的map中,将 setMethod和 getMethod合并成一个 methodDescriptor
 
见 Introspector.java的

     /**
     * Populates the property descriptor table by merging the
     * lists of Property descriptors.
     */

private void processPropertyDescriptors() { 

                        ...
            // Complete simple properties set 
             pd = mergePropertyDescriptor(gpd, spd); //merge get方法解析出的gpd和set方法解析出的spd . 一个PropertyDescriptor里面有两个属性,一个是setMethodName,一个是getMethodName.
                 
                    ....
             properties.put(pd.getName(), pd);  
 
        } 
 
/**
     * Adds the property descriptor to the indexedproperty descriptor only if the
     * types are the same.
     *
     * The most specific property descriptor will take precedence.
     */
    private PropertyDescriptor mergePropertyDescriptor(IndexedPropertyDescriptor ipd,

PropertyDescriptor pd) {

}
PropertyDescriptor里的 private Reference<Class> propertyTypeRef; 里的值决定了type, 距离, int string等类型.

Introspector内省和反射的区别.的更多相关文章

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

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

  2. 反射,内省,BeanUtil的区别

    PS:为了操作反射方便,sun创建了 内省, Apache闲麻烦自己创建了BeanUtils 1.开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所 ...

  3. velocity 是如何实现内省 屏蔽反射的

    velocity的标签中支持$abc 这样的语法,如果abc是一个对象,则写模板时就可以利用它来进行反射,调用一些危险的方法,如 $vm.getClass().newInstance() #set ( ...

  4. Introspector(内省)简单演示样例 与 简单应用

    简单演示样例: package com.asdfLeftHand.test; import java.beans.BeanDescriptor; import java.beans.BeanInfo; ...

  5. 什么是Emit,什么是反射,二者区别到底是什么?(转)

    Emit的准确定义,我们看看微软给出的答案 System.Reflection.Emit 命名空间包含{ 允许编译器或工具发出元数据和发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘 ...

  6. java两种反射的区别 - Class.forName()和ClassLoader.loadClass()

    在理解这两种反射机制之前,需要弄清楚java类的加载机制. 装载:通过类的全限定名获取二进制字节流(二进制的class文件),将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lan ...

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

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

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

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

  9. 详叙BeanWrapper和PropertyDescriptor

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

随机推荐

  1. iOS-.pch如何使用

    今天我们要说的是.pch这个文件 我相信大家并不陌生,因为如果是新手开发工程师 总会被它搞得总报错误. 那么我们要知道.pch到底是干什么的,说白了就是一个预编译文件,在运行程序之前,要对头文件等一些 ...

  2. ios 统一设计,iOS6也玩扁平化

    转:http://esoftmobile.com/2014/01/14/build-ios6-ios7-apps/ 前言 前段时间,苹果在它的开发者网站上放出了iOS系统安装比例,其中iOS7占到78 ...

  3. sql的case when then else end 的语法实现列转行

    SELECT * FROM test5 ; RESOURCES DATETIME CNT ID1 0 2018-01-22 4 12 0 2018-01-24 10 23 0 2018-01-25 2 ...

  4. javajava持有对象(容器类)

    数组是固定的长度去保存对象,还有一些集合类如基本的List.Set.Quene.Map可以存储不固定长度的对象.

  5. [LeetCode] Reverse Lists

    Well, since the head pointer may also be modified, we create a new_head that points to it to facilit ...

  6. CSS 伪元素 使用参考

    伪元素可以做得事情是非常多的,详情大家可以参考这里 大放异彩的伪元素——可以做什么? 本篇主要讲两个伪元素:before和:after的几个要点: 1.:before和:after是加在元素的里面,也 ...

  7. Android异步处理之AsyncTaskLoader简单使用

    简介 不管是在Android应用开发还是Android平台开发中,异步处理通常是最基本的coding要求.如果你还在主线程中写一些数据库,网络请求,读写本地文件等操作的话那说明你还不是一个合格的And ...

  8. PIP源使用国内镜像

    对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成 ...

  9. MySQL 索引设计概要

    在关系型数据库中设计索引其实并不是复杂的事情,很多开发者都觉得设计索引能够提升数据库的性能,相关的知识一定非常复杂. 然而这种想法是不正确的,索引其实并不是一个多么高深莫测的东西,只要我们掌握一定的方 ...

  10. Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

    https://www.jb51.net/article/49789.htm 首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 MySQ ...