propertyutilsbean.java
来自「JAVA 文章管理系统源码」· Java 代码 · 共 1,626 行 · 第 1/5 页
JAVA
1,626 行
if (beanClass == null) {
return null;
}
// Look up any cached descriptors for this bean class
return (FastHashMap) mappedDescriptorsCache.get(beanClass);
}
/**
* <p>Return the mapped property descriptors for this bean.</p>
*
* <p><strong>FIXME</strong> - Does not work with DynaBeans.</p>
*
* @param bean Bean to be introspected
* @deprecated This method should not be exposed
*/
public FastHashMap 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
*
* @exception IllegalAccessException if the caller does not have
* access to the property accessor method
* @exception IllegalArgumentException if <code>bean</code> or
* <code>name</code> is null
* @exception NestedNullException if a nested reference to a
* property returns null
* @exception InvocationTargetException
* if the property accessor method throws an exception
* @exception 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 = -1;
int indexOfMAPPED_DELIM = -1;
int indexOfMAPPED_DELIM2 = -1;
int indexOfNESTED_DELIM = -1;
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 NestedNullException
("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
*
* @exception IllegalAccessException if the caller does not have
* access to the property accessor method
* @exception IllegalArgumentException if <code>bean</code> or
* <code>name</code> is null
* @exception InvocationTargetException if the property accessor method
* throws an exception
* @exception 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><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
*
* @exception IllegalAccessException if the caller does not have
* access to the property accessor method
* @exception IllegalArgumentException if <code>bean</code> or
* <code>name</code> is null
* @exception IllegalArgumentException if a nested reference to a
* property returns null
* @exception InvocationTargetException if the property accessor method
* throws an exception
* @exception 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 = null;
FastHashMap mappedDescriptors =
getMappedPropertyDescriptors(bean);
if (mappedDescriptors == null) {
mappedDescriptors = new FastHashMap();
mappedDescriptors.setFast(true);
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;
}
}
// can't find any
return -1;
}
/**
* <p>Retrieve the property descriptors for the specified class,
* introspecting and caching them the first time a particular bean class
* is encountered.</p>
*
* <p><strong>FIXME</strong> - Does not work with DynaBeans.</p>
*
* @param beanClass Bean class for which property descriptors are requested
*
* @exception IllegalArgumentException if <code>beanClass</code> is null
*/
public PropertyDescriptor[]
getPropertyDescriptors(Class beanClass) {
if (beanClass == null) {
throw new IllegalArgumentException("No bean class specified");
}
// Look up any cached descriptors for this bean class
PropertyDescriptor descriptors[] = null;
descriptors =
(PropertyDescriptor[]) descriptorsCache.get(beanClass);
if (descriptors != null) {
return (descriptors);
}
// Introspect the bean and cache the generated descriptors
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(beanClass);
} catch (IntrospectionException e) {
return (new PropertyDescriptor[0]);
}
descriptors = beanInfo.getPropertyDescriptors();
if (descriptors == null) {
descriptors = new PropertyDescriptor[0];
}
descriptorsCache.put(beanClass, descriptors);
return (descriptors);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?