首页 > 代码库 > Java反射 Introspector
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提供了一种标准的方式作为工具来获取类的属性,时间,方法。
通常用在反射中,查看类的内部信息。
以下为收集到的一个,空间换时间的反射类。
// 类属性缓存,空间换时间
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);
}
}
}
}
Java反射 Introspector
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。