ByteArrayClassLoader byteArrayClassLoader = cache.getByteArrayClassLoader();
Map<Class< ? >, ClassFieldInspector> inspectors = cache.getInspectors();
try {
// otherwise, bytecode generate a specific extractor
ClassFieldInspector inspector = inspectors.get( clazz );
if ( inspector == null ) {
inspector = new ClassFieldInspector( clazz );
inspectors.put( clazz,
inspector );
}
Method setterMethod = (Method) inspector.getSetterMethods().get( fieldName );
Integer index = (Integer) inspector.getFieldNames().get( fieldName );
if ( setterMethod == 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 );
setterMethod = (Method) inspector.getSetterMethods().get( altFieldName );
index = (Integer) inspector.getFieldNames().get( altFieldName );
}
if ( setterMethod != null ) {
final Class< ? > fieldType = setterMethod.getParameterTypes()[0];
final String className = ClassFieldAccessorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + Math.abs( System.identityHashCode( clazz ) ) + "$" + setterMethod.getName();
// generating byte array to create target class
final byte[] bytes = dumpWriter( clazz,
className,
setterMethod,
fieldType,
clazz.isInterface() );
// use bytes to get a class
final Class< ? > newClass = byteArrayClassLoader.defineClass( className.replace( '/',
'.' ),
bytes,
PROTECTION_DOMAIN );
// instantiating target class
final ValueType valueType = ValueType.determineValueType( fieldType );
final Object[] params = {index, fieldType, valueType};
return (BaseClassFieldWriter) newClass.getConstructors()[0].newInstance( params );
} else {
if ( inspector.getFieldNames().containsKey( fieldName ) ) {
if ( inspector.getGetterMethods().get( fieldName ) != null ) {
// field without setter
return null;
} else {
// public field
return null;