@ -318,42 +318,34 @@ public class ReflectivePropertyAccessor implements PropertyAccessor {
* Find a getter method for the specified property .
* Find a getter method for the specified property .
* /
* /
protected Method findGetterForProperty ( String propertyName , Class < ? > clazz , boolean mustBeStatic ) {
protected Method findGetterForProperty ( String propertyName , Class < ? > clazz , boolean mustBeStatic ) {
Method [ ] ms = getSortedClassMethods ( clazz ) ;
return findMethodForProperty ( getPropertyMethodSuffixes ( propertyName ) ,
String propertyMethodSuffix = getPropertyMethodSuffix ( propertyName ) ;
new String [ ] { "get" , "is" } , clazz , mustBeStatic , 0 ) ;
// Try "get*" method...
String getterName = "get" + propertyMethodSuffix ;
for ( Method method : ms ) {
if ( method . getName ( ) . equals ( getterName ) & & method . getParameterTypes ( ) . length = = 0 & &
( ! mustBeStatic | | Modifier . isStatic ( method . getModifiers ( ) ) ) ) {
return method ;
}
}
// Try "is*" method...
getterName = "is" + propertyMethodSuffix ;
for ( Method method : ms ) {
if ( method . getName ( ) . equals ( getterName ) & & method . getParameterTypes ( ) . length = = 0 & &
( boolean . class . equals ( method . getReturnType ( ) ) | | Boolean . class . equals ( method . getReturnType ( ) ) ) & &
( ! mustBeStatic | | Modifier . isStatic ( method . getModifiers ( ) ) ) ) {
return method ;
}
}
return null ;
}
}
/ * *
/ * *
* Find a setter method for the specified property .
* Find a setter method for the specified property .
* /
* /
protected Method findSetterForProperty ( String propertyName , Class < ? > clazz , boolean mustBeStatic ) {
protected Method findSetterForProperty ( String propertyName , Class < ? > clazz , boolean mustBeStatic ) {
return findMethodForProperty ( getPropertyMethodSuffixes ( propertyName ) ,
new String [ ] { "set" } , clazz , mustBeStatic , 1 ) ;
}
private Method findMethodForProperty ( String [ ] methodSuffixes , String [ ] prefixes , Class < ? > clazz ,
boolean mustBeStatic , int numberOfParams ) {
Method [ ] methods = getSortedClassMethods ( clazz ) ;
Method [ ] methods = getSortedClassMethods ( clazz ) ;
String setterName = "set" + getPropertyMethodSuffix ( propertyName ) ;
for ( String methodSuffix : methodSuffixes ) {
for ( String prefix : prefixes ) {
for ( Method method : methods ) {
for ( Method method : methods ) {
if ( method . getName ( ) . equals ( setterName ) & & method . getParameterTypes ( ) . length = = 1 & &
if ( method . getName ( ) . equals ( prefix + methodSuffix )
( ! mustBeStatic | | Modifier . isStatic ( method . getModifiers ( ) ) ) ) {
& & method . getParameterTypes ( ) . length = = numberOfParams
& & ( ! mustBeStatic | | Modifier . isStatic ( method . getModifiers ( ) ) ) ) {
return method ;
return method ;
}
}
}
}
}
}
return null ;
return null ;
}
}
/ * *
/ * *
@ -370,14 +362,30 @@ public class ReflectivePropertyAccessor implements PropertyAccessor {
return methods ;
return methods ;
}
}
/ * *
* Return the method suffixes for a given property name . The default implementation
* uses JavaBean conventions with additional support for properties of the form ' xY '
* where the method ' getXY ( ) ' is used in preference to the JavaBean convention of
* ' getxY ( ) ' .
* /
protected String [ ] getPropertyMethodSuffixes ( String propertyName ) {
String suffix = getPropertyMethodSuffix ( propertyName ) ;
if ( suffix . length ( ) > 0 & & Character . isUpperCase ( suffix . charAt ( 0 ) ) ) {
return new String [ ] { suffix } ;
}
return new String [ ] { suffix , StringUtils . capitalize ( suffix ) } ;
}
/ * *
* Return the method suffix for a given property name . The default implementation
* uses JavaBean conventions .
* /
protected String getPropertyMethodSuffix ( String propertyName ) {
protected String getPropertyMethodSuffix ( String propertyName ) {
if ( propertyName . length ( ) > 1 & & Character . isUpperCase ( propertyName . charAt ( 1 ) ) ) {
if ( propertyName . length ( ) > 1 & & Character . isUpperCase ( propertyName . charAt ( 1 ) ) ) {
return propertyName ;
return propertyName ;
}
}
else {
return StringUtils . capitalize ( propertyName ) ;
return StringUtils . capitalize ( propertyName ) ;
}
}
}
/ * *
/ * *
* Find a field of a certain name on a specified class
* Find a field of a certain name on a specified class