No trecho que instancia um construtor com parametros, ao invés de instanciar novos Class dos tipos do parametros, adicionei a uma List de Types e continuou funcionando, seria por que toda classe tipo Class implementa a interface Type portanto podendo ser identificada como Type também?
Abaixo o código
package br.com.alura.alurator.ioc;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
public class ContainerIoC {
public Object getInstancia(Class<?> tipoFonte) {
Stream<Constructor<?>> streamConstrutor = Stream.of(tipoFonte.getDeclaredConstructors());
Optional<Constructor<?>> optionalConstrutor = streamConstrutor.filter(construtor -> construtor.getParameterCount() == 0)
.findFirst();
try {
if (optionalConstrutor.isPresent()) {
Object newInstance = optionalConstrutor.get().newInstance();
return newInstance;
} else {
Constructor<?> construtor = tipoFonte.getDeclaredConstructors()[0];
List<Type> params = new ArrayList<>();
for (Parameter p : construtor.getParameters()) {
params.add(p.getType());
}
return construtor.newInstance(params.toArray());
}
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}