一、解释
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提供了一种标准的方式作为工具来获取类的属性,时间,方法。
通常用在反射中,查看类的内部信息。
以下为收集到的一个,空间换时间的反射类。
// 类属性缓存,空间换时间
private static final ConcurrentMap, PropertyDescriptor[]> classPropCache =
new ConcurrentHashMap, PropertyDescriptor[]>(64);
/**
* 获取Bean的属性
* @param bean
* @return
*/
private static PropertyDescriptor[] getPropertyDescriptors(Object bean) {
Class beanClass = bean.getClass();
PropertyDescriptor[] cachePds = classPropCache.get(beanClass);
if (null != cachePds) {
return cachePds;
}
try {
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
cachePds = beanInfo.getPropertyDescriptors();
classPropCache.put(beanClass, cachePds);
return cachePds;
} catch (IntrospectionException e) {
throw new RuntimeException(e);
}
}
/**
* 获取Bean的属性
* @param bean bean
* @param propertyName 属性名
* @return 属性值
*/
public static Object getProperty(Object bean, String propertyName) {
PropertyDescriptor[] beanPds = getPropertyDescriptors(bean);
for (PropertyDescriptor propertyDescriptor : beanPds) {
if (propertyDescriptor.getName().equals(propertyName)){
Method readMethod = propertyDescriptor.getReadMethod();
if (null == readMethod) {
continue;
}
if (!readMethod.isAccessible()) {
readMethod.setAccessible(true);
}
try {
return readMethod.invoke(bean);
} catch (Throwable ex) {
throw new RuntimeException("Could not read property '" + propertyName + "' from bean", ex);
}
}
}
return null;
}
/**
* 设置Bean属性
* @param bean bean
* @param propertyName 属性名
* @param value 属性值
*/
public static void setProperty(Object bean, String propertyName, Object value) {
PropertyDescriptor[] beanPds = getPropertyDescriptors(bean);
for (PropertyDescriptor propertyDescriptor : beanPds) {
if (propertyDescriptor.getName().equals(propertyName)){
Method writeMethod = propertyDescriptor.getWriteMethod();
if (null == writeMethod) {
continue;
}
if (!writeMethod.isAccessible()) {
writeMethod.setAccessible(true);
}
try {
writeMethod.invoke(bean, value);
} catch (Throwable ex) {
throw new RuntimeException("Could not set property '" + propertyName + "' to bean", ex);
}
}
}
}