繁体   English   中英

通过使用反射方法在抽象类中创建具体对象

[英]Create a concrete object in a abstract class by using reflect methods

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

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

一个具体的类对其进行了扩展:

public class Person exends Model {
...
}

因此,是否有可能使用静态上下文, Person.all()返回Person列表而不是Model列表?

您知道,通过使用模板或反映诸如getClass().getClassName()getClass().getDeclaredMethod()等方法。

我之所以这么问是因为我已经在PHP库中看到了这一点,并且正在用Java创建类似的库。

您应尽可能避免反射。 它速度慢,难以调试,绕过类型和签名的编译时检查,并且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类具有零参数构造函数,或者根本没有定义构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM