[英]Create different Java classes based on runtime config text
我有一个可以使用不同参数运行一些操作的套件。 操作及其参数在XML配置文件中提供。
有一个单独的类实现每个操作。 所有这些类都扩展了一个抽象的Operation类,因此一旦创建了类,无论实际操作如何,都可以在代码中以相同的方式处理它。
但是,我确实需要创建类。 到目前为止,我看到了两种方法:
一个开关声明:
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模式中设置可靠的值并验证配置),然后使用第二个选项? 还是有更好的东西?
我更愿意使用第二种选择。
一个示例类。 (注意,默认构造函数是必需的,因为它是由.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
}
您还可以在另一个配置文件或属性中拥有限定名称列表,并在尝试创建类之前检查该列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.