java 反射 应用_Java反射的应用 --- 内省

一、基础概念

内省(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 transBean2Map(Object obj) {

if (obj == null) {

return null;

}

HashMap map = new HashMap();

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值