fork download
  1. import java.lang.reflect.Constructor;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.Objects;
  5. import java.util.Optional;
  6. import java.util.stream.Collectors;
  7.  
  8. class Ideone {
  9. public static void main(String[] args) {
  10. System.out.println(
  11. getConstructorsFromTypeFittingActualParameters(Bar.class, Baz.class).size());
  12. System.out.println(
  13. getConstructorsFromTypeFittingActualParameters(Bar.class).size());
  14. System.out.println(
  15. getConstructorsFromTypeFittingActualParameters(Bar.class, String.class).size());
  16. System.out.println(
  17. getConstructorsFromTypeFittingActualParameters(Bar.class, Object.class).size());
  18. }
  19.  
  20. public static List<Constructor<?>> getConstructorsFromTypeFittingActualParameters(
  21. Class<?> type,
  22. Class<?>... actualParameters) {
  23. final Class<?>[] actualParametersNotNull =
  24. Optional.ofNullable(actualParameters).orElseGet(() -> new Class<?>[0]);
  25. return Arrays.stream(type.getConstructors())
  26. .filter(constructor -> constructor.getParameterCount() == actualParametersNotNull.length)
  27. .filter(constructor -> formalParameterTypesAcceptActualParameterTypes(
  28. constructor.getParameterTypes(),
  29. actualParametersNotNull))
  30. .collect(Collectors.toList());
  31. }
  32.  
  33. private static boolean formalParameterTypesAcceptActualParameterTypes(
  34. Class<?>[] formalParameterTypes,
  35. Class<?>[] actualParameterTypes) {
  36. Objects.requireNonNull(formalParameterTypes);
  37. Objects.requireNonNull(actualParameterTypes);
  38. if (formalParameterTypes.length != actualParameterTypes.length) {
  39. }
  40.  
  41. for (int index = 0; index < formalParameterTypes.length; ++index) {
  42. if (!formalParameterTypes[index].isAssignableFrom(actualParameterTypes[index])) {
  43. return false;
  44. }
  45. }
  46. return true;
  47. }
  48. }
  49.  
  50. interface Foo {}
  51.  
  52. class Bar {
  53. public Bar() {}
  54.  
  55. public Bar(Bar other) {}
  56.  
  57. public Bar(Foo other) {}
  58.  
  59. public Bar(String other) {}
  60. }
  61.  
  62. class Baz extends Bar implements Foo {}
Success #stdin #stdout 0.09s 48508KB
stdin
Standard input is empty
stdout
2
1
1
0