基于运行时配置文本创建不同的Java类



我有一个套件,可以运行一些具有不同参数的操作。操作及其参数以XML配置文件提供。

有一个单独的类实现每个操作。所有这些类都扩展了一个抽象的操作类,因此一旦创建了类,可以在代码中以相同的方式处理,无论实际操作是什么。

但是,我确实需要创建类。到目前为止,我看到了两种方法:

  • 开关语句:

    Operation operation;
    switch (operationName) {
    case "OperationA":
        operation = new OperationA();
        break;
    case "OperationB":
        operation = new OperationB();
        break;
    default:
        log.error("Invalid operation name: " + operationName);
        return true;
    }
    
  • 类名称的运行时查找。我从未测试过此选项,但似乎是:

    Operation operation = (Operation)Class.forName(operationName).newinstance();
    

第一个选项似乎很笨拙。第二个选项似乎过多地相信配置,尽管我不确定这一点。

也许我应该只是验证OperationName是包含我所有操作的预定义集或列表的成员(否则将其设置为XML架构中的stone中可能的值并验证配置对其进行验证(,然后使用第二个选项?还是有更好的东西?

我更喜欢使用第二个选项。

示例类。(请注意,需要默认构造函数,因为它是由.newinstance((调用的。您还可以参考此问题:我可以使用class.newinstance((带有构造函数参数?如果要创建新类并使用构造函数并使用一个构造函数使用参数。(

package com.mypackage;
public class SomeObject {
    public SomeObject() {}
}

如何创建该类的实例:

try {
    // you need to use the fully qualified name, not just the class name
    SomeObject object = (SomeObject) Class.forName("com.mypackage.SomeObject").newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
    // here you can handle incorrect config in your XML file
}

您还可以在另一个配置文件或属性中具有合格名称的列表,然后在尝试创建类之前对该列表进行检查。