我知道這個問題可能看起來很愚蠢,因爲我可以手動完成此操作。但我喜歡在一個地方擁有我的所有選項(僅限一個地方)。從類型
我想通過使用虛擬選項類中字段的名稱來設置程序的可用選項(使用commons-cli),以便我可以將值分配給該類的實例。
問題是,我無法弄清楚如何獲取對應於原始類型的類對象並檢索相應的自動裝箱類。
這是我想有工作(除非有沒有這樣的方法getAutoboxClass)
public class PlayGame {
private static final Options opts = new Options();
static {
Field[] allOpts = MCTSOptions.class.getFields();
for (Field f : allOpts) {
opts.addOption(new Option(f.getName(), f.getName(), !f.getType()
.equals(Boolean.TYPE), f.getName()));
}
}
public static void main(String[] args) throws IOException, ParseException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException, SecurityException, NoSuchMethodException {
BasicParser bp = new BasicParser();
CommandLine cl = bp.parse(opts, args);
String[] remainArgs = cl.getArgs();
MCTSOptions params = new MCTSOptions();
for (Field f : MCTSOptions.class.getFields()) {
String name = f.getName();
if (f.getType().equals(Boolean.TYPE)) {
f.set(params, true);
} else if (f.getType().equals(String.class)) {
f.set(params, cl.getOptionValue(name));
} else {
String value = cl.getOptionValue(name);
Method m = f.getType().getAutoboxClass()
.getMethod("valueOf", String.class);
f.set(params, m.invoke(null, value));
}
}
}
//...
}
}
其中MCTSOptions看起來像代碼:
public class MCTSOptions {
public boolean searchOnSample = false;
public double winOnlyMult = 0.5;
public double firstExplorationConstant = 2;
public double nextLearningRate = 0.1;
public double nextExplorationConstant = 2;
public boolean firstUsesSqrt = false;
public boolean nextUsesSqrt = false;
public long timeGiven = 5000L;
public long seed = 1L;
}
(所以現在它只是多頭和雙打,但在未來我可能會添加其他類型)
我不知道任何方法,但在Java中只有8種基元類型。你可以很容易地用一個開關或一系列if來實現這樣的功能。 – ig0774 2013-04-09 20:12:25
JDK中沒有內置任何東西。 Guava有['Primitives.wrap(Class)'](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/primitives/Primitives.html#wrap(java .lang.Class)),但是。 – 2013-04-09 20:17:42