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