【问题标题】:Create a concrete object in a abstract class by using reflect methods使用反射方法在抽象类中创建具体对象
【发布时间】:2018-08-05 01:35:30
【问题描述】:

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

公共抽象类模型{ ... 公共静态列表所有(){ ... } ... }

还有一个扩展它的具体类:

公共类人扩展模型{ ... }

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

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

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

【问题讨论】:

    标签: java reflection abstract-class concrete-inheritance


    【解决方案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 类有一个零参数的构造函数,或者根本没有定义构造函数。

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 2016-08-13
      • 2011-12-23
      • 1970-01-01
      相关资源
      最近更新 更多