Отличить предоставленный по умолчанию конструктор args от объявленного - PullRequest
0 голосов
/ 19 января 2019

Простой вопрос: как я могу отличить конструктор по умолчанию. то есть:

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.

1 Ответ

0 голосов
/ 19 января 2019

Обнаружить это просто невозможно, поскольку нет разницы в скомпилированном байт-коде.

Класс с конструктором по умолчанию

class AClass { } // will have a default no args constructor 

неявно компилируется как

class AClass { 
    AClass() {}
}

Первая форма - просто синтаксический сахар.

Также ваш следующий пример

class AClass {
    private final int i;

    public AClass() { i = 0; }
}

Может быть записан с конструктором по умолчанию в эквивалентной форме

class AClass {
    private final int i = 0;
}

Кроме того, я не вижу ни одного случая использования, когда вам придется это обнаруживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...