private String generateClassNameForInstantiator(final InstantiatorKey key) { StringBuilder sb = new StringBuilder(); sb.append( "org.simpleflatmapper.reflect.generated.") .append(getPackageName(key.getDeclaringClass())) .append(".AsmInstantiator").append(key.getDeclaringClass().getSimpleName()); sb.append("From"); sb.append(replaceArray(key.getSource().getSimpleName())); String[] injectedParams = key.getInjectedParams(); if (injectedParams != null && injectedParams.length > 0) { sb.append("Into"); int e = Math.min(16, injectedParams.length); for(int i = 0; i < e; i++) { if (i!=0) { sb.append("And"); } sb.append(injectedParams[i]); } int l = injectedParams.length - e; if (l >0) { sb.append("And").append(Integer.toString(l)).append("More"); } } sb.append("_I").append(Long.toHexString(classNumber.getAndIncrement())); return sb.toString(); }
private String generateClassNameForInstantiator(final InstantiatorKey key) { StringBuilder sb = new StringBuilder(); sb.append( "org.simpleflatmapper.reflect.generated.") .append(getPackageName(key.getDeclaringClass())) .append(".AsmInstantiator").append(key.getDeclaringClass().getSimpleName()); sb.append("From"); sb.append(replaceArray(key.getSource().getSimpleName())); String[] injectedParams = key.getInjectedParams(); if (injectedParams != null && injectedParams.length > 0) { sb.append("Into"); int e = Math.min(16, injectedParams.length); for(int i = 0; i < e; i++) { if (i!=0) { sb.append("And"); } sb.append(injectedParams[i]); } int l = injectedParams.length - e; if (l >0) { sb.append("And").append(Integer.toString(l)).append("More"); } } sb.append("_I").append(Long.toHexString(classNumber.getAndIncrement())); return sb.toString(); }
@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); } }