我决定用 Java 编写我自己的小型 ArgumentParser, 关键是它有方法
public void addOption(String optionName, Class valueType, boolean required)
做类似的事情
ArgumentParser parser = new ArgumentParser();
parser.addOption("--input_path", String.class, true);
Map<String, Object> options = parser.parse(args); //args is String[]
String inputPath = (String)options.get("--input_path"); //hooray!
但我不知道如何尝试自动将 String 转换为某个用户指定的类? 下面的代码显然不起作用
options.put(currentOption, registeredOptions.get(currentOption).valueOf(arg));
是否有一些我想不通的简单方法可以做到这一点? 或者你可能会说这是一个坏主意,我很感激任何建议! 谢谢!
最佳答案
您的目标基本上是创建一个函数,该函数将返回一个对象,该对象的类作为参数传递。
我不知道这个问题的通用解决方案。
但是有一些部分解决方案结合在一起,所以我相信,将回答您正在寻找的问题:
A. 返回的对象是一个数字:
对于 int 和 float,解决方案很明显:
int ival = Integer.parseInt(strParam);
float fval = Float.parseFloat(strParam);
B. 返回的对象类有一个字符串构造函数,即接收单个字符串参数的构造函数
即:
parser.addOption("--input_path", MySpecialClass.class, true);
哪里:
class MySpecialClass {
public MySpecialClass(String param) // <----------- string constructor
}
在这里您可以使用反射通过获取和激活构造函数来实例化所需的对象。 注意:我们的代码不需要知道返回类标识,但不管天气与否,它都有一个字符串构造函数:
Constructor stringConstructor = classObject.getConstructor(new Class[]{String.class});
Object objectToReturn = stringConstructor.newInstance(stringParam);
最后结合上面给出了一个类似于这样的参数处理函数:
Object processAnyParam(String strParam, Class returnClass, boolean mandatory) {
if (returnClass.equals(int.class)) {
return Integer.parseInt(strParam);
}
else if (returnClass.equals(float.class)) {
return Float.parseFloat(strParam);
}
else if (maybe other numeric types here...) {
}
else {
try {
Constructor stringConstructor = classObject.getConstructor(new Class[]{String.class});
} catch (NoSuchMethodException e) {
// no string constructor; bail out..
return null;
}
return stringConstructor.newInstance(strParam);
}
}
关于java - 在 Java 中将字符串转换为 SomeType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24716693/