zoukankan      html  css  js  c++  java
  • 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. }



  • 相关阅读:
    [POI2014]KUR-Couriers
    MySQL有哪些索引
    索引的设计原则
    explain参数之extra
    explain参数之type
    explain参数之select_type
    如何查询最后一行的记录
    为什么MySQL自增id不连续?
    MySQL字符集
    MySQL有哪些优化策略?
  • 原文地址:https://www.cnblogs.com/LiuChunfu/p/6624732.html
Copyright © 2011-2022 走看看