在 java 中使用泛型创建实例而不是反射

Using generic type to create instance instead of reflection in java

我的代码如下所示:

public class Person{
    private Configuration configuration;
    public void act(){
        final Action action = new Factory().createAction(configuration);
        ....
    }
}

public class Factory{
    public Action createAction(Configuration configuration){
        Constructor<? extends Action> constructor =
                  configuration.getActionClass.
                  getConstructor(configuration.getClass());
        return constructor.newInstance(configuration);
    }
}

public class Configuration{
    private Class<? extends Action> actionClass;

    public void setActionClass(Class<? extend Action> cls){
        this.actionClass = cls;
    }

    public Class<? extends Action> getActionClass(){
        return this.actionClass;
    }
}

每次调用 act() 时,都会出于某种原因创建一个新的 Action 实例。我需要继承 Action 并将其传递给 act().

所以我在工厂方法上使用反射来实现这一点。但这似乎有点矫枉过正而且不安全。

是否可以使用类型安全的方法(例如泛型)来替换反射?

由于类型擦除(参见 #1),如果您想在运行时实例化一个类型,则无法避免反射和 Class<?> 参数,因此回答您的问题可能有点矫枉过正但是 new T(); 是不可能的。

不过,您可以通过向 Configuration class.

添加泛型类型参数来使其类型安全
public class Configuration<T extends Action> {
    private Class<T> actionClass;

    public void setActionClass(Class<T> cls){
        this.actionClass = cls;
    }

    public Class<T> getActionClass(){
        return this.actionClass;
    }
}

并删除对它的所有 raw 引用。 (即,将 Configuration 切换到 Configuration<T> 任何使用的地方)

我使用 Java 8 的新功能从朋友那里得到了一个非常巧妙的解决方案。

public class Person{
    private Configuration configuration;
    public void act(){
        final Action action = configuration.getActionFactory().apply(configuration);
        ....
    }
}

public class Configuration{
    private Function<Configuration, Action> actionFactory = Action::new;

    public void setActionFactory(Function<Configuration, Action> actionFactory){
        this.actionFactory = actionFactory;
    }

    public Function<Configuration, Action> actionFactory getActionFactory(){
        return this.actionFactory;
    }
}