[英]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.