Introspector内省和反射的区别.

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等类型.

时间: 2024-11-08 22:26:59

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

Introspector内省和反射的区别. 什么是Bean,对应的jdk概念有哪些,

Introspector 是一个专门处理bean的工具类.用来获取Bean体系里的 propertiesDescriptor,methodDescriptor. 要理解这个,就要理解下面几个议题. *bean是啥? 普通的class 可能有 computerAges(){ }等方法. Bean是 一个field ,有 get 或者set. 除了这些别无其他. bean是class的一种 例如 public class People { String name; public String get

反射,内省,BeanUtil的区别

PS:为了操作反射方便,sun创建了 内省, Apache闲麻烦自己创建了BeanUtils 1.开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性. 2.sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单.易用的API操作Bean的属性--BeanUtils.

内省及反射属性复制案例

1.内省 1 /** 2 * 测试内省(可以得到从父类继承的get.set方法) 3 * 4 * @author feigu 5 * 6 */ 7 public class TestIntrospector { 8 public static void main(String[] args) { 9 try { 10 BeanInfo info = Introspector.getBeanInfo(Person.class); 11 // 得到属性描述符 12 PropertyDescripto

Java中的内省与反射

很多朋友在深入的接触Java语言后就会发现这样两个词:反射和内省,在什么场合下应用以及如何使用?今天把这二者放在一起介绍,因为它们二者是相辅相成的. 反射 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术.例如我们可以通过类名来生成一个类的实例:知道了方法名,就可以调用这个方法:知道了属性名就可以访问这个属性的值,还是写两个例子让大家更直观的了解反射的使用方法: //通过类名来构造一个类的实例 ClassClasscls_st

理解java中反射,区别Class.forName(),Class.forName().instance() ,new

先了解一下反射(这玩意着实让我理解了很久啊)博文参考(http://blog.csdn.net/cookieweb/article/details/7056277) 先了解一些基本的概念:运行时,编译时,编译型,解释型,类加载器,动态加载类  什么是编译?将原程序翻译成计算机语言,就是二进制代码,在java中是将.java文件也就是源程序翻译成.class的字节码  什么是编译时?将原程序翻译成计算机语言的过程中,将.java翻译为.class文件的过程  什么是运行时?就是在启动这个程序的时候

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

Emit的准确定义,我们看看微软给出的答案 System.Reflection.Emit 命名空间包含{ 允许编译器或工具发出元数据和发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘上生成 PE 文件的类. 这些类的主要客户端是脚本引擎和编译器. } Emit可以直接让编译器发出元数据及msil,这样做的优势又是什么? MSIL是将.NET代码转化为机器语言的一个中间过程.它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言.当用户编译一个.NET程序时,编译器将源代码翻

理解Java的反射与内省及其区别

java的内省机制和反射机制什么区别 内省操作只针对JavaBean,只有符合JavaBean规则的类的成员才可以采用内省API进行操作....而反射则不同,一个类的所有成员都可以进行反射操作. 内省和反射的操作也有很大不同,内省是先得到属性描述器PropertyDecriptor后再进行各种操作,反射则是先得到类的字节码Class后再进行各种操作的. 反射(reflection)(实现可扩展性智能化) 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对

Java反射及 IoC原理、内省机制

JAVA反射及IoC原理.JAVA内省 1. 反射 反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述 主要指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性. 1.2 反射机制的作用 在运行时判断任

Java反射 Introspector

一.解释 Introspector  内省,自我检查. 位于java中的java.beans包中,其原文说明文为: The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean. 中文大意为 Introspector提供了一种标准的方式作为工具来获取类的属性,时间,方法. 通常用在