@SuppressWarnings("unchecked") public <T, P> Setter<T,P> createSetter(Field field) throws Exception { Setter<T,P> setter = (Setter<T, P>) setterCache.get(field); if (setter == null) { final String className = generateClassNameForSetter(field); final byte[] bytes = generateSetterByteCodes(field, className); final Class<?> type = createClass(className, bytes, field.getDeclaringClass().getClassLoader()); setter = (Setter<T, P>) type.newInstance(); setterCache.putIfAbsent(field, setter); } return setter; }
@SuppressWarnings("unchecked") public <T, P> Getter<T,P> createGetter(final Field m) throws Exception { Getter<T,P> getter = (Getter<T, P>) getterCache.get(m); if (getter == null) { final String className = generateClassNameForGetter(m); final byte[] bytes = generateGetterByteCodes(m, className); final Class<?> type = createClass(className, bytes, m.getDeclaringClass().getClassLoader()); getter = (Getter<T, P>) type.newInstance(); getterCache.putIfAbsent(m, getter); } return getter; }
@SuppressWarnings("unchecked") public <T, P> Getter<T,P> createGetter(final Method m) throws Exception { Getter<T,P> getter = (Getter<T, P>) getterCache.get(m); if (getter == null) { final String className = generateClassNameForGetter(m); final byte[] bytes = generateGetterByteCodes(m, className); final Class<?> type = createClass(className, bytes, m.getDeclaringClass().getClassLoader()); getter = (Getter<T, P>) type.newInstance(); getterCache.putIfAbsent(m, getter); } return getter; }
@SuppressWarnings("unchecked") public <T, P> Setter<T,P> createSetter(final Method m) throws Exception { Setter<T,P> setter = (Setter<T, P>) setterCache.get(m); if (setter == null) { final String className = generateClassNameForSetter(m); final byte[] bytes = generateSetterByteCodes(m, className); final Class<?> type = createClass(className, bytes, m.getDeclaringClass().getClassLoader()); setter = (Setter<T, P>) type.newInstance(); setterCache.putIfAbsent(m, setter); } return setter; }
@SuppressWarnings("unchecked") public <T, P> Getter<T,P> createGetter(final Field m) throws Exception { Getter<T,P> getter = (Getter<T, P>) getterCache.get(m); if (getter == null) { final String className = generateClassNameForGetter(m); final byte[] bytes = generateGetterByteCodes(m, className); final Class<?> type = createClass(className, bytes, m.getDeclaringClass().getClassLoader()); getter = (Getter<T, P>) type.newInstance(); getterCache.putIfAbsent(m, getter); } return getter; }
@SuppressWarnings("unchecked") public <T, P> Setter<T,P> createSetter(final Method m) throws Exception { Setter<T,P> setter = (Setter<T, P>) setterCache.get(m); if (setter == null) { final String className = generateClassNameForSetter(m); final byte[] bytes = generateSetterByteCodes(m, className); final Class<?> type = createClass(className, bytes, m.getDeclaringClass().getClassLoader()); setter = (Setter<T, P>) type.newInstance(); setterCache.putIfAbsent(m, setter); } return setter; }
@SuppressWarnings("unchecked") public <T, P> Setter<T,P> createSetter(Field field) throws Exception { Setter<T,P> setter = (Setter<T, P>) setterCache.get(field); if (setter == null) { final String className = generateClassNameForSetter(field); final byte[] bytes = generateSetterByteCodes(field, className); final Class<?> type = createClass(className, bytes, field.getDeclaringClass().getClassLoader()); setter = (Setter<T, P>) type.newInstance(); setterCache.putIfAbsent(field, setter); } return setter; }
@SuppressWarnings("unchecked") public <T, P> Getter<T,P> createGetter(final Method m) throws Exception { Getter<T,P> getter = (Getter<T, P>) getterCache.get(m); if (getter == null) { final String className = generateClassNameForGetter(m); final byte[] bytes = generateGetterByteCodes(m, className); final Class<?> type = createClass(className, bytes, m.getDeclaringClass().getClassLoader()); getter = (Getter<T, P>) type.newInstance(); getterCache.putIfAbsent(m, getter); } return getter; }
@SuppressWarnings("unchecked") public <S, T> Instantiator<S, T> createEmptyArgsInstantiator(final Class<S> source, final Class<? extends T> target) throws Exception { InstantiatorKey instantiatorKey = new InstantiatorKey(target, source); Class<? extends Instantiator<?, ?>> instantiatorType = instantiatorCache.get(instantiatorKey); if (instantiatorType == null) { final String className = generateClassNameForInstantiator(instantiatorKey); final byte[] bytes = ConstructorBuilder.createEmptyConstructor(className, source, target); instantiatorType = (Class<? extends Instantiator<?, ?>>) createClass(className, bytes, target.getClassLoader()); instantiatorCache.putIfAbsent(instantiatorKey, instantiatorType); } return (Instantiator<S, T>) instantiatorType.newInstance(); }
@SuppressWarnings("unchecked") public <S, T> Instantiator<S, T> createEmptyArgsInstantiator(final Class<S> source, final Class<? extends T> target) throws Exception { InstantiatorKey instantiatorKey = new InstantiatorKey(target, source); Class<? extends Instantiator<?, ?>> instantiatorType = instantiatorCache.get(instantiatorKey); if (instantiatorType == null) { final String className = generateClassNameForInstantiator(instantiatorKey); final byte[] bytes = ConstructorBuilder.createEmptyConstructor(className, source, target); instantiatorType = (Class<? extends Instantiator<?, ?>>) createClass(className, bytes, target.getClassLoader()); instantiatorCache.putIfAbsent(instantiatorKey, instantiatorType); } return (Instantiator<S, T>) instantiatorType.newInstance(); }
@SuppressWarnings("unchecked") public <S, T> AbstractMapper<S, T> createMapper(final FieldKey<?>[] keys, final FieldMapper<S, T>[] mappers, final FieldMapper<S, T>[] constructorMappers, final BiInstantiator<S, MappingContext<? super S>, T> instantiator, final Class<? super S> source, final Class<T> target) throws Exception { MapperKey key = MapperKey.of(keys, mappers, constructorMappers, instantiator, target, source); Constructor<SourceMapper<S, T>> constructor = (Constructor<SourceMapper<S, T>>) fieldMapperCache.get(key); if (constructor == null) { final String className = generateClassNameForFieldMapper(mappers, constructorMappers, source, target); final byte[] bytes = MapperAsmBuilder.dump(className, mappers, constructorMappers, source, target); Class<SourceMapper<S, T>> type = (Class<SourceMapper<S, T>>) asmFactory.createClass(className, bytes, target.getClass().getClassLoader()); constructor = (Constructor<SourceMapper<S, T>>) type.getDeclaredConstructors()[0]; fieldMapperCache.put(key, constructor); } return (AbstractMapper<S, T>) constructor.newInstance(mappers, constructorMappers, instantiator); } }
@SuppressWarnings("unchecked") public <S, T> AbstractMapper<S, T> createMapper(final FieldKey<?>[] keys, final FieldMapper<S, T>[] mappers, final FieldMapper<S, T>[] constructorMappers, final BiInstantiator<S, MappingContext<? super S>, T> instantiator, final Class<? super S> source, final Class<T> target) throws Exception { MapperKey key = MapperKey.of(keys, mappers, constructorMappers, instantiator, target, source); Constructor<SourceMapper<S, T>> constructor = (Constructor<SourceMapper<S, T>>) fieldMapperCache.get(key); if (constructor == null) { final String className = generateClassNameForFieldMapper(mappers, constructorMappers, source, target); final byte[] bytes = MapperAsmBuilder.dump(className, mappers, constructorMappers, source, target); Class<SourceMapper<S, T>> type = (Class<SourceMapper<S, T>>) asmFactory.createClass(className, bytes, target.getClass().getClassLoader()); constructor = (Constructor<SourceMapper<S, T>>) type.getDeclaredConstructors()[0]; fieldMapperCache.put(key, constructor); } return (AbstractMapper<S, T>) constructor.newInstance(mappers, constructorMappers, instantiator); } }
@SuppressWarnings("unchecked") public <S, T> Instantiator<S, T> createInstantiator(final Class<S> source, final InstantiatorDefinition instantiatorDefinition, final Map<Parameter, Getter<? super S, ?>> injections, boolean builderIgnoresNullValues) throws Exception { InstantiatorKey<S> instantiatorKey = new InstantiatorKey<S>(instantiatorDefinition, injections, source); Class<? extends Instantiator<?, ?>> instantiator = instantiatorCache.get(instantiatorKey); Instantiator<Void, ?> builderInstantiator = null; if (instantiator == null) { final String className = generateClassNameForInstantiator(instantiatorKey); final byte[] bytes; if (instantiatorDefinition instanceof ExecutableInstantiatorDefinition) { bytes = InstantiatorBuilder.createInstantiator(className, source, (ExecutableInstantiatorDefinition)instantiatorDefinition, injections); } else { builderInstantiator = createInstantiator(Void.class, ((BuilderInstantiatorDefinition)instantiatorDefinition).getBuilderInstantiator(), new HashMap<Parameter, Getter<? super Void, ?>>(), builderIgnoresNullValues); bytes = InstantiatorBuilder.createInstantiator( className, source, (BuilderInstantiatorDefinition)instantiatorDefinition, injections, builderIgnoresNullValues); } instantiator = (Class<? extends Instantiator<?, ?>>) createClass(className, bytes, instantiatorKey.getDeclaringClass().getClassLoader()); instantiatorCache.put(instantiatorKey, instantiator); } Map<String, Getter<? super S, ?>> getterPerName = new HashMap<String, Getter<? super S, ?>>(); for(Entry<Parameter, Getter<? super S, ?>> e : injections.entrySet()) { getterPerName.put(e.getKey().getName(), e.getValue()); } if (instantiatorDefinition instanceof ExecutableInstantiatorDefinition) { return (Instantiator<S, T>) instantiator.getConstructor(Map.class).newInstance(getterPerName); } else { return (Instantiator<S, T>) instantiator.getConstructor(Map.class, Instantiator.class).newInstance(getterPerName, builderInstantiator); } }
@SuppressWarnings("unchecked") public <S, T> Instantiator<S, T> createInstantiator(final Class<S> source, final InstantiatorDefinition instantiatorDefinition, final Map<Parameter, Getter<? super S, ?>> injections, boolean builderIgnoresNullValues) throws Exception { InstantiatorKey<S> instantiatorKey = new InstantiatorKey<S>(instantiatorDefinition, injections, source); Class<? extends Instantiator<?, ?>> instantiator = instantiatorCache.get(instantiatorKey); Instantiator<Void, ?> builderInstantiator = null; if (instantiator == null) { final String className = generateClassNameForInstantiator(instantiatorKey); final byte[] bytes; if (instantiatorDefinition instanceof ExecutableInstantiatorDefinition) { bytes = InstantiatorBuilder.createInstantiator(className, source, (ExecutableInstantiatorDefinition)instantiatorDefinition, injections); } else { builderInstantiator = createInstantiator(Void.class, ((BuilderInstantiatorDefinition)instantiatorDefinition).getBuilderInstantiator(), new HashMap<Parameter, Getter<? super Void, ?>>(), builderIgnoresNullValues); bytes = InstantiatorBuilder.createInstantiator( className, source, (BuilderInstantiatorDefinition)instantiatorDefinition, injections, builderIgnoresNullValues); } instantiator = (Class<? extends Instantiator<?, ?>>) createClass(className, bytes, instantiatorKey.getDeclaringClass().getClassLoader()); instantiatorCache.put(instantiatorKey, instantiator); } Map<String, Getter<? super S, ?>> getterPerName = new HashMap<String, Getter<? super S, ?>>(); for(Entry<Parameter, Getter<? super S, ?>> e : injections.entrySet()) { getterPerName.put(e.getKey().getName(), e.getValue()); } if (instantiatorDefinition instanceof ExecutableInstantiatorDefinition) { return (Instantiator<S, T>) instantiator.getConstructor(Map.class).newInstance(getterPerName); } else { return (Instantiator<S, T>) instantiator.getConstructor(Map.class, Instantiator.class).newInstance(getterPerName, builderInstantiator); } }
(BuilderInstantiatorDefinition)instantiatorDefinition, injections, builderIgnoresNullValues); instantiator = (Class<? extends BiInstantiator<?, ?, ?>>) createClass(className, bytes, instantiatorKey.getDeclaringClass().getClassLoader()); biInstantiatorCache.put(instantiatorKey, instantiator);
(BuilderInstantiatorDefinition)instantiatorDefinition, injections, builderIgnoresNullValues); instantiator = (Class<? extends BiInstantiator<?, ?, ?>>) createClass(className, bytes, instantiatorKey.getDeclaringClass().getClassLoader()); biInstantiatorCache.put(instantiatorKey, instantiator);