mappedpropertydescriptor.java
来自「JAVA 文章管理系统源码」· Java 代码 · 共 563 行 · 第 1/2 页
JAVA
563 行
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.beanutils;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.security.AccessController;
import java.security.PrivilegedAction;
/**
* A MappedPropertyDescriptor describes one mapped property.
* Mapped properties are multivalued properties like indexed properties
* but that are accessed with a String key instead of an index.
* Such property values are typically stored in a Map collection.
* For this class to work properly, a mapped value must have
* getter and setter methods of the form
* <p><code>get<strong>Property</strong>(String key)<code> and
* <p><code>set<Property>(String key, Object value)<code>,
* <p>where <code><strong>Property</strong></code> must be replaced
* by the name of the property.
* @see java.beans.PropertyDescriptor
*
* @author Rey Fran鏾is
* @author Gregor Ra齧an
* @version $Revision: 1.18.2.1 $ $Date: 2004/07/27 21:44:26 $
*/
public class MappedPropertyDescriptor extends PropertyDescriptor {
// ----------------------------------------------------- Instance Variables
/**
* The underlying data type of the property we are describing.
*/
private Class mappedPropertyType;
/**
* The reader method for this property (if any).
*/
private Method mappedReadMethod;
/**
* The writer method for this property (if any).
*/
private Method mappedWriteMethod;
/**
* The parameter types array for the reader method signature.
*/
private static final Class[] stringClassArray = new Class[]{String.class};
// ----------------------------------------------------------- Constructors
/**
* Constructs a MappedPropertyDescriptor for a property that follows
* the standard Java convention by having getFoo and setFoo
* accessor methods, with the addition of a String parameter (the key).
* Thus if the argument name is "fred", it will
* assume that the writer method is "setFred" and the reader method
* is "getFred". Note that the property name should start with a lower
* case character, which will be capitalized in the method names.
*
* @param propertyName The programmatic name of the property.
* @param beanClass The Class object for the target bean. For
* example sun.beans.OurButton.class.
*
* @exception IntrospectionException if an exception occurs during
* introspection.
*/
public MappedPropertyDescriptor(String propertyName, Class beanClass)
throws IntrospectionException {
super(propertyName, null, null);
if (propertyName == null || propertyName.length() == 0) {
throw new IntrospectionException("bad property name: " +
propertyName + " on class: " + beanClass.getClass().getName());
}
setName(propertyName);
String base = capitalizePropertyName(propertyName);
// Look for mapped read method and matching write method
try {
mappedReadMethod = findMethod(beanClass, "get" + base, 1,
stringClassArray);
Class params[] = { String.class, mappedReadMethod.getReturnType() };
mappedWriteMethod = findMethod(beanClass, "set" + base, 2, params);
} catch (IntrospectionException e) {
;
}
// If there's no read method, then look for just a write method
if (mappedReadMethod == null) {
mappedWriteMethod = findMethod(beanClass, "set" + base, 2);
}
if ((mappedReadMethod == null) && (mappedWriteMethod == null)) {
throw new IntrospectionException("Property '" + propertyName +
"' not found on " +
beanClass.getName());
}
findMappedPropertyType();
}
/**
* This constructor takes the name of a mapped property, and method
* names for reading and writing the property.
*
* @param propertyName The programmatic name of the property.
* @param beanClass The Class object for the target bean. For
* example sun.beans.OurButton.class.
* @param mappedGetterName The name of the method used for
* reading one of the property values. May be null if the
* property is write-only.
* @param mappedSetterName The name of the method used for writing
* one of the property values. May be null if the property is
* read-only.
*
* @exception IntrospectionException if an exception occurs during
* introspection.
*/
public MappedPropertyDescriptor(String propertyName, Class beanClass,
String mappedGetterName, String mappedSetterName)
throws IntrospectionException {
super(propertyName, null, null);
if (propertyName == null || propertyName.length() == 0) {
throw new IntrospectionException("bad property name: " +
propertyName);
}
setName(propertyName);
// search the mapped get and set methods
mappedReadMethod =
findMethod(beanClass, mappedGetterName, 1, stringClassArray);
if (mappedReadMethod != null) {
Class params[] = { String.class, mappedReadMethod.getReturnType() };
mappedWriteMethod =
findMethod(beanClass, mappedSetterName, 2, params);
} else {
mappedWriteMethod =
findMethod(beanClass, mappedSetterName, 2);
}
findMappedPropertyType();
}
/**
* This constructor takes the name of a mapped property, and Method
* objects for reading and writing the property.
*
* @param propertyName The programmatic name of the property.
* @param mappedGetter The method used for reading one of
* the property values. May be be null if the property
* is write-only.
* @param mappedSetter The method used for writing one the
* property values. May be null if the property is read-only.
*
* @exception IntrospectionException if an exception occurs during
* introspection.
*/
public MappedPropertyDescriptor(String propertyName,
Method mappedGetter, Method mappedSetter)
throws IntrospectionException {
super(propertyName, mappedGetter, mappedSetter);
if (propertyName == null || propertyName.length() == 0) {
throw new IntrospectionException("bad property name: " +
propertyName);
}
setName(propertyName);
mappedReadMethod = mappedGetter;
mappedWriteMethod = mappedSetter;
findMappedPropertyType();
}
// -------------------------------------------------------- Public Methods
/**
* Gets the Class object for the property values.
*
* @return The Java type info for the property values. Note that
* the "Class" object may describe a built-in Java type such as "int".
* The result may be "null" if this is a mapped property that
* does not support non-keyed access.
* <p>
* This is the type that will be returned by the mappedReadMethod.
*/
public Class getMappedPropertyType() {
return mappedPropertyType;
}
/**
* Gets the method that should be used to read one of the property value.
*
* @return The method that should be used to read the property value.
* May return null if the property can't be read.
*/
public Method getMappedReadMethod() {
return mappedReadMethod;
}
/**
* Sets the method that should be used to read one of the property value.
*
* @param mappedGetter The new getter method.
*/
public void setMappedReadMethod(Method mappedGetter)
throws IntrospectionException {
mappedReadMethod = mappedGetter;
findMappedPropertyType();
}
/**
* Gets the method that should be used to write one of the property value.
*
* @return The method that should be used to write one of the property value.
* May return null if the property can't be written.
*/
public Method getMappedWriteMethod() {
return mappedWriteMethod;
}
/**
* Sets the method that should be used to write the property value.
*
* @param mappedSetter The new setter method.
*/
public void setMappedWriteMethod(Method mappedSetter)
throws IntrospectionException {
mappedWriteMethod = mappedSetter;
findMappedPropertyType();
}
// ------------------------------------------------------- Private Methods
/**
* Introspect our bean class to identify the corresponding getter
* and setter methods.
*/
private void findMappedPropertyType() throws IntrospectionException {
try {
mappedPropertyType = null;
if (mappedReadMethod != null) {
if (mappedReadMethod.getParameterTypes().length != 1) {
throw new IntrospectionException
("bad mapped read method arg count");
}
mappedPropertyType = mappedReadMethod.getReturnType();
if (mappedPropertyType == Void.TYPE) {
throw new IntrospectionException
("mapped read method " +
mappedReadMethod.getName() + " returns void");
}
}
if (mappedWriteMethod != null) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?