使用反射方法在抽象 class 中创建一个具体对象

Create a concrete object in a abstract class by using reflect methods

假设我有一个名为 Model 的抽象 class,具有以下静态方法:

 
public abstract class Model {
    ...
    public static List<Model> all() {
       ...
    }
    ...
}

具体 class 扩展它:

public class Person exends Model {
...
}

那么,是否可以使用静态上下文 Person.all() return Person 而不是 Model 的列表?

你知道的,通过使用模板,或者反射getClass().getClassName()getClass().getDeclaredMethod()等方法

我问这个是因为我在 PHP 库中看到过,我正在 java 中创建一个类似的库。

你应该尽可能避免反射。它很慢,很难调试,它绕过了 compile-time 类型和签名检查,而且它不能在运行时通过 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 class 有一个 zero-argument 构造函数,或者根本没有定义构造函数。