📄 propertyutilsbean.java
字号:
* thrown. * * @param bean Bean whose property is to be extracted * @param name <code>propertyname(key)</code> of the property value * to be extracted * @throws IllegalAccessException if the caller does not have * access to the property accessor method * @throws InvocationTargetException if the property accessor method * throws an exception * @throws NoSuchMethodException if an accessor method for this * propety cannot be found */ public Object getMappedProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { if(bean == null) { throw new IllegalArgumentException("No bean specified"); } if(name == null) { throw new IllegalArgumentException("No name specified"); } // Identify the index of the requested individual property int delim = name.indexOf(PropertyUtils.MAPPED_DELIM); int delim2 = name.indexOf(PropertyUtils.MAPPED_DELIM2); if((delim < 0) || (delim2 <= delim)) { throw new IllegalArgumentException("Invalid mapped property '" + name + "'"); } // Isolate the name and the key String key = name.substring(delim + 1, delim2); name = name.substring(0, delim); // Request the specified indexed property value return (getMappedProperty(bean, name, key)); } /** * Return the value of the specified mapped property of the specified * bean, with no type conversions. * * @param bean Bean whose property is to be extracted * @param name Mapped property name of the property value to be extracted * @param key Key of the property value to be extracted * @throws IllegalAccessException if the caller does not have * access to the property accessor method * @throws InvocationTargetException if the property accessor method * throws an exception * @throws NoSuchMethodException if an accessor method for this * propety cannot be found */ public Object getMappedProperty(Object bean, String name, String key) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { if(bean == null) { throw new IllegalArgumentException("No bean specified"); } if(name == null) { throw new IllegalArgumentException("No name specified"); } if(key == null) { throw new IllegalArgumentException("No key specified"); } // Handle DynaBean instances specially Object result = null; // Retrieve the property descriptor for the specified property PropertyDescriptor descriptor = getPropertyDescriptor(bean, name); if(descriptor == null) { throw new NoSuchMethodException("Unknown property '" + name + "'"); } if(descriptor instanceof MappedPropertyDescriptor) { // Call the keyed getter method if there is one Method readMethod = ((MappedPropertyDescriptor)descriptor).getMappedReadMethod(); if(readMethod != null) { Object keyArray[] = new Object[1]; keyArray[0] = key; result = invokeMethod(readMethod, bean, keyArray); } else { throw new NoSuchMethodException("Property '" + name + "' has no mapped getter method"); } } else { /* means that the result has to be retrieved from a map */ Method readMethod = descriptor.getReadMethod(); if(readMethod != null) { Object invokeResult = invokeMethod(readMethod, bean, new Object[0]); /* test and fetch from the map */ if(invokeResult instanceof java.util.Map) { result = ((java.util.Map)invokeResult).get(key); } } else { throw new NoSuchMethodException("Property '" + name + "' has no mapped getter method"); } } return result; } /** * <p>Return the mapped property descriptors for this bean class.</p> * <p/> * <p><strong>FIXME</strong> - Does not work with DynaBeans.</p> * * @param beanClass Bean class to be introspected */ public Map getMappedPropertyDescriptors(Class beanClass) { if(beanClass == null) { return null; } // Look up any cached descriptors for this bean class return (Map)mappedDescriptorsCache.get(beanClass); } /** * <p>Return the mapped property descriptors for this bean.</p> * <p/> * <p><strong>FIXME</strong> - Does not work with DynaBeans.</p> * * @param bean Bean to be introspected */ public Map getMappedPropertyDescriptors(Object bean) { if(bean == null) { return null; } return (getMappedPropertyDescriptors(bean.getClass())); } /** * Return the value of the (possibly nested) property of the specified * name, for the specified bean, with no type conversions. * * @param bean Bean whose property is to be extracted * @param name Possibly nested name of the property to be extracted * @throws IllegalAccessException if the caller does not have * access to the property accessor method * @throws IllegalArgumentException if <code>bean</code> or * <code>name</code> is null * @throws IllegalArgumentException if a nested reference to a * property returns null * @throws InvocationTargetException if the property accessor method throws an exception * @throws NoSuchMethodException if an accessor method for this * propety cannot be found */ public Object getNestedProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { if(bean == null) { throw new IllegalArgumentException("No bean specified"); } if(name == null) { throw new IllegalArgumentException("No name specified"); } int indexOfINDEXED_DELIM; int indexOfMAPPED_DELIM; int indexOfMAPPED_DELIM2; int indexOfNESTED_DELIM; while(true) { indexOfNESTED_DELIM = name.indexOf(PropertyUtils.NESTED_DELIM); indexOfMAPPED_DELIM = name.indexOf(PropertyUtils.MAPPED_DELIM); indexOfMAPPED_DELIM2 = name.indexOf(PropertyUtils.MAPPED_DELIM2); if(indexOfMAPPED_DELIM2 >= 0 && indexOfMAPPED_DELIM >= 0 && (indexOfNESTED_DELIM < 0 || indexOfNESTED_DELIM > indexOfMAPPED_DELIM)) { indexOfNESTED_DELIM = name.indexOf(PropertyUtils.NESTED_DELIM, indexOfMAPPED_DELIM2); } else { indexOfNESTED_DELIM = name.indexOf(PropertyUtils.NESTED_DELIM); } if(indexOfNESTED_DELIM < 0) { break; } String next = name.substring(0, indexOfNESTED_DELIM); indexOfINDEXED_DELIM = next.indexOf(PropertyUtils.INDEXED_DELIM); indexOfMAPPED_DELIM = next.indexOf(PropertyUtils.MAPPED_DELIM); if(bean instanceof Map) { bean = ((Map)bean).get(next); } else if(indexOfMAPPED_DELIM >= 0) { bean = getMappedProperty(bean, next); } else if(indexOfINDEXED_DELIM >= 0) { bean = getIndexedProperty(bean, next); } else { bean = getSimpleProperty(bean, next); } if(bean == null) { throw new NullPointerException("Null property value for '" + name.substring(0, indexOfNESTED_DELIM) + "'"); } name = name.substring(indexOfNESTED_DELIM + 1); } indexOfINDEXED_DELIM = name.indexOf(PropertyUtils.INDEXED_DELIM); indexOfMAPPED_DELIM = name.indexOf(PropertyUtils.MAPPED_DELIM); if(bean instanceof Map) { bean = ((Map)bean).get(name); } else if(indexOfMAPPED_DELIM >= 0) { bean = getMappedProperty(bean, name); } else if(indexOfINDEXED_DELIM >= 0) { bean = getIndexedProperty(bean, name); } else { bean = getSimpleProperty(bean, name); } return bean; } /** * Return the value of the specified property of the specified bean, * no matter which property reference format is used, with no * type conversions. * * @param bean Bean whose property is to be extracted * @param name Possibly indexed and/or nested name of the property * to be extracted * @throws IllegalAccessException if the caller does not have * access to the property accessor method * @throws IllegalArgumentException if <code>bean</code> or * <code>name</code> is null * @throws InvocationTargetException if the property accessor method * throws an exception * @throws NoSuchMethodException if an accessor method for this * propety cannot be found */ public Object getProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { return (getNestedProperty(bean, name)); } /** * <p>Retrieve the property descriptor for the specified property of the * specified bean, or return <code>null</code> if there is no such * descriptor. This method resolves indexed and nested property * references in the same manner as other methods in this class, except * that if the last (or only) name element is indexed, the descriptor * for the last resolved property itself is returned.</p> * <p/> * <p><strong>FIXME</strong> - Does not work with DynaBeans.</p> * * @param bean Bean for which a property descriptor is requested * @param name Possibly indexed and/or nested name of the property for * which a property descriptor is requested * @throws IllegalAccessException if the caller does not have * access to the property accessor method * @throws IllegalArgumentException if <code>bean</code> or * <code>name</code> is null * @throws IllegalArgumentException if a nested reference to a * property returns null * @throws InvocationTargetException if the property accessor method * throws an exception * @throws NoSuchMethodException if an accessor method for this * propety cannot be found */ public PropertyDescriptor getPropertyDescriptor(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { if(bean == null) { throw new IllegalArgumentException("No bean specified"); } if(name == null) { throw new IllegalArgumentException("No name specified"); } // Resolve nested references while(true) { int period = findNextNestedIndex(name); if(period < 0) { break; } String next = name.substring(0, period); int indexOfINDEXED_DELIM = next.indexOf(PropertyUtils.INDEXED_DELIM); int indexOfMAPPED_DELIM = next.indexOf(PropertyUtils.MAPPED_DELIM); if(indexOfMAPPED_DELIM >= 0 && (indexOfINDEXED_DELIM < 0 || indexOfMAPPED_DELIM < indexOfINDEXED_DELIM)) { bean = getMappedProperty(bean, next); } else { if(indexOfINDEXED_DELIM >= 0) { bean = getIndexedProperty(bean, next); } else { bean = getSimpleProperty(bean, next); } } if(bean == null) { throw new IllegalArgumentException("Null property value for '" + name.substring(0, period) + "'"); } name = name.substring(period + 1); } // Remove any subscript from the final name value int left = name.indexOf(PropertyUtils.INDEXED_DELIM); if(left >= 0) { name = name.substring(0, left); } left = name.indexOf(PropertyUtils.MAPPED_DELIM); if(left >= 0) { name = name.substring(0, left); } // Look up and return this property from our cache // creating and adding it to the cache if not found. if((bean == null) || (name == null)) { return (null); } PropertyDescriptor descriptors[] = getPropertyDescriptors(bean); if(descriptors != null) { for(int i = 0; i < descriptors.length; i++) { if(name.equals(descriptors[i].getName())) return (descriptors[i]); } } PropertyDescriptor result; Map mappedDescriptors = getMappedPropertyDescriptors(bean); if(mappedDescriptors == null) { mappedDescriptors = new HashMap(); mappedDescriptorsCache.put(bean.getClass(), mappedDescriptors); } result = (PropertyDescriptor)mappedDescriptors.get(name); if(result == null) { // not found, try to create it try { result = new MappedPropertyDescriptor(name, bean.getClass()); } catch(IntrospectionException ie) { } if(result != null) { mappedDescriptors.put(name, result); } } return result; } private int findNextNestedIndex(String expression) { // walk back from the end to the start // and find the first index that int bracketCount = 0; for(int i = 0, size = expression.length(); i < size; i++) { char at = expression.charAt(i); switch(at) { case PropertyUtils.NESTED_DELIM: if(bracketCount < 1) { return i; } break; case PropertyUtils.MAPPED_DELIM: case PropertyUtils.INDEXED_DELIM: // not bothered which ++bracketCount; break; case PropertyUtils.MAPPED_DELIM2: case PropertyUtils.INDEXED_DELIM2: // not bothered which --bracketCount; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -