Java 无法使用参数实例化子类

Java 无法使用参数实例化子类,java,Java,我一直收到错误:java.lang.NoSuchMethodException:com.production.workflow.MyWorkflow.com.production.model.entity.WorkflowEntity 我有一个构造函数需要WorkflowEntity,所以我无法理解它为什么会说NoSuchMethod。构造函数继承是否有什么东西阻止了它的实例化 我的实例化工厂: public static Workflow factory(WorkflowEntity work

我一直收到错误:java.lang.NoSuchMethodException:com.production.workflow.MyWorkflow.com.production.model.entity.WorkflowEntity

我有一个构造函数需要WorkflowEntity,所以我无法理解它为什么会说NoSuchMethod。构造函数继承是否有什么东西阻止了它的实例化

我的实例化工厂:

public static Workflow factory(WorkflowEntity workflowEntity) {
    try {
        Class<?> clazz = Class.forName(workflowEntity.getClassName()).asSubclass(Workflow.class);
        Constructor c = clazz.getConstructor(WorkflowEntity.class);
        Object workflowClass = c.newInstance(clazz);
        return (Workflow) workflowClass;
    } catch (Exception e) {
        e.printStackTrace();
        logger.severe("Unable to instantiate "+workflowEntity.getClassName()+" class: " + e.getLocalizedMessage());
    }

    return null;
}
扩展类:

abstract public class Workflow {
    protected static final Logger logger = Logger.getLogger(Workflow.class.getName());

    private WorkflowEntity entity;
    protected WorkflowProcess workflowProcess;

    @Autowired
    private WorkflowProcessService workflowProcessService;

    /* Don't use this one */
    public Workflow() { }

    /* Default constructor */
    public Workflow (WorkflowEntity entity) {
        this.entity = entity;

        //get first workflow process
        //@todo this should factor in rule, for multiple starting points
        for (WorkflowProcessEntity workflowProcessEntity : entity.getWorkflowProcesses()) {
            workflowProcess = WorkflowProcess.factory(workflowProcessEntity);
            break;
        }
    }

我认为您只想在newInstance调用时将workflowEntity传入构造函数,而不是类型化类。

我认为您只想在newInstance调用时将workflowEntity传入构造函数,而不是类型化类。

构造函数在继承过程中失去了外部可见性

您需要在MyWorkflow中重新定义它

这样做是因为子类可能不支持超类创建过程。因此,超级对象构造函数对子类没有意义,如果它们在外部可见,甚至是不安全的

如果在没有WorkflowEntity的情况下实例化类可以使用,那么还应该删除默认构造函数。只需将其从工作流中删除,而不添加到MyWorkflow

UPD

你也应该考虑使用泛型来避免类的转换。

public Workflow create(WorkflowEntity workflowEntity) throws 
               ClassNotFoundException, NoSuchMethodException, SecurityException
               , InstantiationException, IllegalAccessException
               , IllegalArgumentException, InvocationTargetException {

    Class<? extends Workflow> clazz = Class.forName(workflowEntity.getClassName()).asSubclass(Workflow.class);
    Constructor<? extends Workflow> c = clazz.getConstructor(WorkflowEntity.class);
    Workflow workflowClass = c.newInstance(clazz);
    return workflowClass;
}

class WorkflowEntity {

    public String getClassName() {
        return "className";
    };
}

class Workflow {

    Workflow(WorkflowEntity entity) {
    };
}

class MyWorkflow extends Workflow {

    MyWorkflow(WorkflowEntity entity) {
        super(entity);
    }
}

构造函数在继承过程中失去了外部可见性

您需要在MyWorkflow中重新定义它

这样做是因为子类可能不支持超类创建过程。因此,超级对象构造函数对子类没有意义,如果它们在外部可见,甚至是不安全的

如果在没有WorkflowEntity的情况下实例化类可以使用,那么还应该删除默认构造函数。只需将其从工作流中删除,而不添加到MyWorkflow

UPD

你也应该考虑使用泛型来避免类的转换。

public Workflow create(WorkflowEntity workflowEntity) throws 
               ClassNotFoundException, NoSuchMethodException, SecurityException
               , InstantiationException, IllegalAccessException
               , IllegalArgumentException, InvocationTargetException {

    Class<? extends Workflow> clazz = Class.forName(workflowEntity.getClassName()).asSubclass(Workflow.class);
    Constructor<? extends Workflow> c = clazz.getConstructor(WorkflowEntity.class);
    Workflow workflowClass = c.newInstance(clazz);
    return workflowClass;
}

class WorkflowEntity {

    public String getClassName() {
        return "className";
    };
}

class Workflow {

    Workflow(WorkflowEntity entity) {
    };
}

class MyWorkflow extends Workflow {

    MyWorkflow(WorkflowEntity entity) {
        super(entity);
    }
}

代码中有两个问题:

子类不会自动继承构造函数。您需要将MyWorkflowEntity构造函数添加到MyWorkflow类中。 您的新实例调用需要使用workflowEntity实例,而不是您现在提供的类实例 在这里:


代码中有两个问题:

子类不会自动继承构造函数。您需要将MyWorkflowEntity构造函数添加到MyWorkflow类中。 您的新实例调用需要使用workflowEntity实例,而不是您现在提供的类实例 在这里:


考虑构建器模式而不是工厂模式。下面是一个示例,该示例构建了一个采用WorkflowEntity构造函数参数的工作流,并构建了一个不采用WorkflowEntity模式的工作流,该工作流仅显示了通过生成器可用的多个选项

public class WorkFlowBuilder
{
    private WorkflowEntity constructorParameter;
    private Class workflowClass;

    public WorkFlowBuilder(Class desiredWorkflowClass)
    {
        if (desiredWorkflowClass != null)
        {
            workflowClass = desiredWorkflowClass;
        }
        else
        {
            throw new IllegalArgumentException("blah blah blah");
        }
    }

    public void setConstructorParameter(final WorkflowEntity newValue)
    {
        constructorParameter = newValue;
    }

    public WorkFlow build()
    {
        Object workflowObject;

        if (constructorParameter != null)
        {
            Constructor constructor = workflowClass.getConstructor(WorkflowEntity.class);
            Object workflowObject;

            workflowObject = constructor.newInstance(workflowEntity);
        }
        else
        {
            workflowObject = workflowClass.newInstance();
        }

        return (WorkFlow)workflowObject;
    }
}
按如下方式使用:

WorkFlowBuilder builder = new WorkFlowBuilder(MyWorkFlow.class);
WorkflowEntity entity = new WorkFlowEntity();
WorkFlow item;

entity... set stuff.

builder.setConstructerParameter(entity)
item = builder.build();

考虑构建器模式而不是工厂模式。下面是一个示例,该示例构建了一个采用WorkflowEntity构造函数参数的工作流,并构建了一个不采用WorkflowEntity模式的工作流,该工作流仅显示了通过生成器可用的多个选项

public class WorkFlowBuilder
{
    private WorkflowEntity constructorParameter;
    private Class workflowClass;

    public WorkFlowBuilder(Class desiredWorkflowClass)
    {
        if (desiredWorkflowClass != null)
        {
            workflowClass = desiredWorkflowClass;
        }
        else
        {
            throw new IllegalArgumentException("blah blah blah");
        }
    }

    public void setConstructorParameter(final WorkflowEntity newValue)
    {
        constructorParameter = newValue;
    }

    public WorkFlow build()
    {
        Object workflowObject;

        if (constructorParameter != null)
        {
            Constructor constructor = workflowClass.getConstructor(WorkflowEntity.class);
            Object workflowObject;

            workflowObject = constructor.newInstance(workflowEntity);
        }
        else
        {
            workflowObject = workflowClass.newInstance();
        }

        return (WorkFlow)workflowObject;
    }
}
按如下方式使用:

WorkFlowBuilder builder = new WorkFlowBuilder(MyWorkFlow.class);
WorkflowEntity entity = new WorkFlowEntity();
WorkFlow item;

entity... set stuff.

builder.setConstructerParameter(entity)
item = builder.build();

与工厂相比,这种方法有优势吗?在库中使用普通java实践是否更标准?我的首选是在构造函数参数数量可变时使用builder。Factory看起来不错,但在您的情况下,我会将MyWorkFlow.class作为Factory方法参数传递,而不是将MyWorkFlow类名作为WorkFlowEntity参数传递。与Factory相比,此方法有优势吗?在库中使用普通java实践是否更标准?我的首选是在构造函数参数数量可变时使用builder。Factory看起来很好,但在您的情况下,我会将MyWorkFlow.class作为Factory方法参数传递,而不是将MyWorkFlow类名作为WorkFlowEntity参数传递。