Создать конкретный объект в абстрактном классе с помощью методов отражения
Предположим, у меня есть абстрактный класс 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 имеет конструктор с нулевым аргументом или вообще не определяет конструктор.