
com.wizzardo.http.framework.di.DependencyForge Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of http Show documentation
Show all versions of http Show documentation
Java HTTP-server, based on epoll-lib
The newest version!
package com.wizzardo.http.framework.di;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
import java.util.Arrays;
import java.util.function.Supplier;
/**
* Created by wizzardo on 27/03/17.
*/
public interface DependencyForge {
default Dependency extends T> forge(Class extends T> clazz, DependencyScope scope) {
return forge(clazz, createSupplier(clazz), scope);
}
default Dependency extends T> forge(Class extends T> clazz, Supplier supplier, DependencyScope scope) {
if (supplier == null)
return null;
return scope.forge(clazz, supplier, scope);
}
default Supplier createSupplier(Class extends T> clazz) {
Constructor>[] constructors = clazz.getConstructors();
if (constructors.length == 0)
return () -> newInstance(clazz);
for (Constructor> constructor : constructors) {
if (constructor.getParameterCount() == 0)
return () -> newInstance((Constructor) constructor);
}
Constructor constructor = (Constructor) constructors[0];
Parameter[] parameters = constructor.getParameters();
return () -> {
Object[] args = new Object[parameters.length];
for (int i = 0; i < args.length; i++) {
Parameter parameter = parameters[i];
try {
args[i] = DependencyFactory.get(parameter.getType(), parameter.getAnnotations());
} catch (Exception e) {
throw new IllegalStateException("Cannot resolve " + i + "th (" +
parameter.getType().getName() + (parameter.isNamePresent() ? " " + parameter.getName() : "") +
") argument of " + clazz.getName() + "'s constructors", e);
}
}
return newInstance(constructor, args);
};
}
static T newInstance(Class clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new IllegalStateException("can't create instance of class " + clazz, e);
}
}
static T newInstance(Constructor constructor) {
try {
return constructor.newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("can't create instance of class " + constructor.getDeclaringClass(), e);
}
}
static T newInstance(Constructor constructor, Object[] args) {
try {
return constructor.newInstance(args);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | IllegalArgumentException e) {
throw new IllegalStateException("can't create instance of class " + constructor.getDeclaringClass() + " with args: " + Arrays.toString(args), e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy