import java.lang.reflect.Constructor;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
class Ideone {
public static void main
(String[] args
) { getConstructorsFromTypeFittingActualParameters(Bar.class, Baz.class).size());
getConstructorsFromTypeFittingActualParameters(Bar.class).size());
getConstructorsFromTypeFittingActualParameters
(Bar.
class,
String.
class).
size()); getConstructorsFromTypeFittingActualParameters
(Bar.
class,
Object.
class).
size()); }
public static List<Constructor<?>> getConstructorsFromTypeFittingActualParameters(
Class<?> type,
Class<?>... actualParameters) {
final Class<?>[] actualParametersNotNull =
Optional.ofNullable(actualParameters).orElseGet(() -> new Class<?>[0]);
return Arrays.
stream(type.
getConstructors()) .filter(constructor -> constructor.getParameterCount() == actualParametersNotNull.length)
.filter(constructor -> formalParameterTypesAcceptActualParameterTypes(
constructor.getParameterTypes(),
actualParametersNotNull))
.collect(Collectors.toList());
}
private static boolean formalParameterTypesAcceptActualParameterTypes(
Class<?>[] formalParameterTypes,
Class<?>[] actualParameterTypes) {
Objects.requireNonNull(formalParameterTypes);
Objects.requireNonNull(actualParameterTypes);
if (formalParameterTypes.length != actualParameterTypes.length) {
}
for (int index = 0; index < formalParameterTypes.length; ++index) {
if (!formalParameterTypes[index].isAssignableFrom(actualParameterTypes[index])) {
return false;
}
}
return true;
}
}
interface Foo {}
class Bar {
public Bar() {}
public Bar(Bar other) {}
public Bar(Foo other) {}
}
class Baz extends Bar implements Foo {}