Java反射 Introspector

本文详细介绍了JavaBean中的Introspector类使用方法,通过示例代码展示了如何利用该类获取JavaBean的属性、事件及方法等信息,并采用空间换时间的优化策略提升性能。
一、解释
Introspector  内省,自我检查。
位于java中的java.beans包中,其原文说明文为:
  1. The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean.
中文大意为
  1. Introspector提供了一种标准的方式作为工具来获取类的属性,时间,方法。
通常用在反射中,查看类的内部信息。
以下为收集到的一个,空间换时间的反射类。
  1. // 类属性缓存,空间换时间
  2. private static final ConcurrentMap, PropertyDescriptor[]> classPropCache =
  3. new ConcurrentHashMap, PropertyDescriptor[]>(64);
  4. /**
  5. * 获取Bean的属性
  6. * @param bean
  7. * @return
  8. */
  9. private static PropertyDescriptor[] getPropertyDescriptors(Object bean) {
  10. Class beanClass = bean.getClass();
  11. PropertyDescriptor[] cachePds = classPropCache.get(beanClass);
  12. if (null != cachePds) {
  13. return cachePds;
  14. }
  15. try {
  16. BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
  17. cachePds = beanInfo.getPropertyDescriptors();
  18. classPropCache.put(beanClass, cachePds);
  19. return cachePds;
  20. } catch (IntrospectionException e) {
  21. throw new RuntimeException(e);
  22. }
  23. }
  24. /**
  25. * 获取Bean的属性
  26. * @param bean bean
  27. * @param propertyName 属性名
  28. * @return 属性值
  29. */
  30. public static Object getProperty(Object bean, String propertyName) {
  31. PropertyDescriptor[] beanPds = getPropertyDescriptors(bean);
  32. for (PropertyDescriptor propertyDescriptor : beanPds) {
  33. if (propertyDescriptor.getName().equals(propertyName)){
  34. Method readMethod = propertyDescriptor.getReadMethod();
  35. if (null == readMethod) {
  36. continue;
  37. }
  38. if (!readMethod.isAccessible()) {
  39. readMethod.setAccessible(true);
  40. }
  41. try {
  42. return readMethod.invoke(bean);
  43. } catch (Throwable ex) {
  44. throw new RuntimeException("Could not read property '" + propertyName + "' from bean", ex);
  45. }
  46. }
  47. }
  48. return null;
  49. }
  50. /**
  51. * 设置Bean属性
  52. * @param bean bean
  53. * @param propertyName 属性名
  54. * @param value 属性值
  55. */
  56. public static void setProperty(Object bean, String propertyName, Object value) {
  57. PropertyDescriptor[] beanPds = getPropertyDescriptors(bean);
  58. for (PropertyDescriptor propertyDescriptor : beanPds) {
  59. if (propertyDescriptor.getName().equals(propertyName)){
  60. Method writeMethod = propertyDescriptor.getWriteMethod();
  61. if (null == writeMethod) {
  62. continue;
  63. }
  64. if (!writeMethod.isAccessible()) {
  65. writeMethod.setAccessible(true);
  66. }
  67. try {
  68. writeMethod.invoke(bean, value);
  69. } catch (Throwable ex) {
  70. throw new RuntimeException("Could not set property '" + propertyName + "' to bean", ex);
  71. }
  72. }
  73. }
  74. }



转载于:https://www.cnblogs.com/LiuChunfu/p/6624732.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值