Java反射 Introspector

Posted CodingBoy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射 Introspector相关的知识,希望对你有一定的参考价值。

一、解释
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. }







以上是关于Java反射 Introspector的主要内容,如果未能解决你的问题,请参考以下文章

JAVA反射之内省

BeanUtils.getProperty性能分析

Introspector内省和反射的区别.

内省Introspector(反射操作javaBean)

java 反射代码片段

内省Introspector 和BeanUtils 工具对反射属性的包装(简单的不是一点点哦)