Простой вопрос: как я могу отличить конструктор по умолчанию. то есть:
class AClass { } // will have a default no args constructor -> public AClass() {}
из одного указанного типа:
class AClass {
private final int i;
public AClass() { i = 0; }
}
При проверке опций, которые предоставляют библиотеки отражений, я не могу найти ничего, что позволило бы мне отличить одно от другого ...
Я пробовал в основном с методами, предоставленными Class#get*Constructor(s)
Может быть, у меня есть туннельное зрение, и я что-то забываю, или есть другой подход к этому, которого мне не хватает ... любая помощь будет оценена!
EDIT:
Это метод, который я использую, вот где мне нужно определить, определен ли такой конструктор пользователем:
protected void adaptAfterLoading(final Class<?> loadedClass) {
Arrays.asList(loadedClass.getDeclaredConstructors()).forEach(System.out::println);
System.out.println("$$$$$$$$$$$ " + loadedClass.getDeclaredConstructors());
Arrays
.stream(loadedClass.getDeclaredConstructors())
.filter(
((Predicate<Constructor<?>>) Constructor::isSynthetic)
.negate())
.map(ConstructorRep::loadFrom)
.forEach(this::addConstructor);
}
Итак ... если вам интересно, почему isSynthetic не работает:
С здесь :
13,1. Форма двоичного файла -
7. Любые конструкции, представленные компилятором Java, которые не имеют соответствующей конструкции в исходном коде, должны быть помечены как синтетические, , за исключением конструкторов по умолчанию , метода инициализации класса и значения и методы valueOf класса Enum.