// then just create an instance of the special class field extractor
return new SelfReferenceClassFieldReader( clazz,
fieldName );
} else {
// otherwise, bytecode generate a specific extractor
ClassFieldInspector inspector = inspectors.get( clazz );
if ( inspector == null ) {
inspector = new ClassFieldInspector( clazz );
inspectors.put( clazz,
inspector );
}
Class< ? > fieldType = (Class< ? >) inspector.getFieldTypes().get( fieldName );
Method getterMethod = (Method) inspector.getGetterMethods().get( fieldName );
Integer index = (Integer) inspector.getFieldNames().get( fieldName );
if ( fieldType == null && fieldName.length() > 1 && Character.isLowerCase( fieldName.charAt( 0 ) ) && Character.isUpperCase( fieldName.charAt(1) ) ) {
// it might be that odd case of javabeans naming conventions that does not use lower case first letters if the second is uppercase
String altFieldName = Character.toUpperCase( fieldName.charAt( 0 ) ) + fieldName.substring( 1 );
fieldType = (Class< ? >) inspector.getFieldTypes().get( altFieldName );
if( fieldType != null ) {
// it seems it is the corner case indeed.
getterMethod = (Method) inspector.getGetterMethods().get( altFieldName );
index = (Integer) inspector.getFieldNames().get( altFieldName );
}
}
if ( fieldType != null && getterMethod != null ) {
final String className = ClassFieldAccessorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + Math.abs( System.identityHashCode( clazz ) ) + "$" + getterMethod.getName();