一、基础概念

内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。Java JDK中提供了一套 API 用来访问某个属性的 getter/setter 方法,这就是内省。

BeanInfo:

希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类,该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。
常用方法:
getPropertyDescriptors():获得 beans PropertyDescriptor。
返回:
描述受此 bean 支持的可编辑属性的 PropertyDescriptor 数组。如果该信息应该通过自动分析获得,则可能返回 null。
如果某个属性已建立索引,则结果数组中该属性的条目将属于 PropertyDescriptor 的 IndexedPropertyDescriptor 子类。
getPropertyDescriptors 的客户端可以使用 "instanceof" 来检查给定 PropertyDescriptor 是否是一个 IndexedPropertyDescriptor。

PropertyDescriptor

描述 Java Bean 通过一对存储器方法导出的一个属性,继承FeatureDescriptor。

FeatureDescriptor

是 PropertyDescriptor、EventSetDescriptor 和 MethodDescriptor 等的公共基类。
它支持一些可以设置和检索任意的内省描述符(introspection descriptor)的公共信息。
此外,它还提供了一种扩展机制,从而任意属性/值对都可以与设计特性相关联。

Introspector

Introspector 类为通过工具学习有关受目标 Java bean 支持的属性、事件和方法的知识提供了一个标准方法。
对于这三种信息,Introspector 将分别分析 bean 的类和超类,寻找显式和隐式信息,使用这些信息构建一个全面描述目标 bean 的 BeanInfo 对象。
因为 Introspector 缓存 BeanInfo 类来获得更好的性能,所以如果在使用多个类加载器的应用程序中使用它,则需小心谨慎。通常,在破坏一个已用于 introspect 类的 ClassLoader 时,应使用 Introspector.flushCaches 和 Introspector.flushFromCaches 方法从缓存中清除所有内省的类。

二、应用示例

    /**
* 实体类转换成map形式
*/
public static HashMap<String, Object> transBean2Map(Object obj) {
if (obj == null) {
return null;
}
HashMap<String, Object> map = new HashMap<String, Object>();
try {
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName().substring(0, 1).toUpperCase() + property.getName().substring(1);
// 过滤class属性
if (!key.equals("class")) {
// 得到property对应的getter方法
Method getter = property.getReadMethod();
Object value = getter.invoke(obj);
if (null==value) {
continue;
}
map.put(key, value);
}
}
} catch (Exception e) {
}
return map;
}

参考文档:http://www.cnblogs.com/peida/archive/2013/06/03/3090842.html

Java反射的应用 --- 内省的更多相关文章

  1. java 反射,注解,泛型,内省(高级知识点)

     Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs    取得任何一个已知名称的class的内部信息, 包括 ...

  2. Java反射之对JavaBean的内省操作

    上一篇我们说了Java反射之数组的反射应用 这篇我们来模拟实现那些javabean的框架(BeanUtils)的基本操作. [一] 什么是JavaBean JavaBean 是一种JAVA语言写成的可 ...

  3. Java反射机制深入研究

    ava 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”.   在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? ...

  4. 11.Java反射机制 哦对了,前面的序号来自随笔关于编程之路的思索第一篇

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

  5. 转!!java反射机制

    Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象 ...

  6. java 反射机制01

    // */ // ]]>   java反射机制01 Table of Contents 1 反射机制 2 反射成员 2.1 java.lang.Class 2.2 Constructor 2.3 ...

  7. Java反射机制学习

    Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...

  8. 转:Java反射教程

    原文来自于:http://www.importnew.com/9078.html 什么是反射?反射有什么用处? 1. 什么是反射? “反射(Reflection)能够让运行于JVM中的程序检测和修改运 ...

  9. Java反射(Reflection)

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

随机推荐

  1. Python-查找并保存特定字符串后面的字符串

    -- -- 本算法用于查找并存储“特定字符串”后面的字符串. -- 举例: strli = "kaka is li is da is wei !" #用于查找的字符串 sep_li ...

  2. 18. docker 容器部署 python-redis

    1. 编写 Vagrantfile 并创建虚拟机 并虚拟机绑定外部 192.168.205.10:8888 ip:port # -*- mode: ruby -*- # vi: set ft=ruby ...

  3. POJ 3660 Cow Contest【Floyd 传递闭包】

    传送门:http://poj.org/problem?id=3660 题意:有n头牛, 给你m对关系.(a, b)表示牛a能打败牛b, 求在给出的这些关系下, 能确定多少头牛的排名. 传递闭包: 关系 ...

  4. MVPR下的PHP分页教程

    这个PHP分页其实不难,现在就开始看看核心思路吧. 我习惯从最底层开始看起. 1. 首先用LIMIT偏移QUERY的指针 /* * get hot post by current page * @pa ...

  5. 猜数字游戏(随机数和Scannner的应用)

    在指定范围内生成一个随机数作为目标值,用户对目标值进行猜测. import java.util.Random; // 随机数 import java.util.Scanner; // 获取用户输入 p ...

  6. JavaScript sort()方法总结

    sort() 方法用于对数组的元素进行排序. 语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函数. 注:如果调用该方法时没有使用参数,将按字母顺序对 ...

  7. Creo 2.0 Toolkit 解锁的问题

    近期开发Creo Toolkit遇到一个问题,在自己本机开发完成后运行并无问题,但是如果拿去给别人的机子运行会报出 提示“creo ToolKit应用程序在分配到您的地址之前未被解锁”,在与PTC 技 ...

  8. selenium滚动条应用,爬永远讲不完的故事

    from selenium import webdriver class Lj(object): def __init__(self): self.driver = webdriver.Chrome( ...

  9. 如何正确理解SQL关联子查询

    一.基本逻辑 对于外部查询返回的每一行数据,内部查询都要执行一次.在关联子查询中是信息流是双向的.外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录.然后,外部查询根据 ...

  10. Deep learning with Python

    一.导论 1.1 人工智能.机器学习.深度学习 人工智能.机器学习 人工智能:1980年代达到高峰的是专家系统,符号AI是之前的,但不能解决模糊.复杂的问题. 机器学习是把数据.答案做输入,规则作输出 ...