使用反射方法在抽象 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 构造函数,或者根本没有定义构造函数。
假设我有一个名为 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 构造函数,或者根本没有定义构造函数。