Создать конкретный объект в абстрактном классе с помощью методов отражения

Предположим, у меня есть абстрактный класс Model с использованием следующего статического метода:

 
публичный абстрактный класс Model {
    ...
    открытый статический список all() {
       ...
    }
    ...
}

И конкретный класс расширяет его:

открытый класс Person расширяет Model {
...
}

Итак, возможно ли, используя статический контекст, Person.all() вернуть список Person а не из Model?

Вы знаете, используя Шаблон, или отражаете такие методы, как getClass().getClassName() а также getClass().getDeclaredMethod() и так далее.

Я спрашиваю об этом, потому что я видел это в библиотеке PHP, и я создаю подобную библиотеку в Java.

1 ответ

Решение

Вы всегда должны избегать рефлексии, когда это возможно. Он медленный, его трудно отлаживать, он обходит проверку типов и сигнатур во время компиляции и не может быть оптимизирован во время выполнения JIT.

Вы, вероятно, хотите использовать поставщика вместо:

public static <M extends Model> List<M> all(Supplier<M> constructor) {
    List<M> models = new ArrayList<>();

    for ( /* ... */ ) {
        M model = constructor.get();

        // initialize model here
        // ...

        models.add(model);
    }
}

Вызов метода выглядит так:

List<Person> allPersons = all(Person::new);

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

Другие вопросы по тегам