2013-04-09 64 views
0
獲取autobox類

我知道這個問題可能看起來很愚蠢,因爲我可以手動完成此操作。但我喜歡在一個地方擁有我的所有選項(僅限一個地方)。從類型

我想通過使用虛擬選項類中字段的名稱來設置程序的可用選項(使用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; 
} 

(所以現在它只是多頭和雙打,但在未來我可能會添加其他類型)

+0

我不知道任何方法,但在Java中只有8種基元類型。你可以很容易地用一個開關或一系列if來實現這樣的功能。 – ig0774 2013-04-09 20:12:25

+1

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

回答

1

有沒有內置的方式來做到這一點。

這就是爲什麼,例如,番石榴爲此任務提供a helper method。它在內部被實現爲基元和包裝之間的簡單映射。

+0

謝謝。我在我的pom文件中添加了番石榴基元,並使用了Primitives.wrap – dspyz 2013-04-09 20:22:16

1

爲什麼不使用對象(布爾,長等)而不是基元?

+0

我可以。但我仍然認爲可能有辦法獲得這些課程,我只是不知道。那將是我的第一選擇。 – dspyz 2013-04-09 20:07:44