2012-07-23 53 views
0

我在HashMap中存儲了一些類名。當用戶提供名稱時,該特定的類應該運行。我怎樣才能做到這一點?請任何幫助。如何運行從String轉換的類?

我在下面做了類似的事,但是我沒有發現類沒有發現異常。

Map<String,String> ruleMap = new HashMap<String, String>(); 

    ruleMap.put("1", "CalculatorTest"); 
    ruleMap.put("2", "AreaTest") 
JUnitCore junit = new JUnitCore(); 

,並調用方法,

for (Map.Entry<String, String> entry : ruleMap.entrySet()) 

    { 
     Class c = null; 

     if(selection.equals(entry.getKey())) 
     { 
      try 
      { 
       c = Class.forName(entry.getValue()); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
      junit.run(c); 
      break; 
     } 
    } 

當我打電話喜歡它下面是工作的罰款。

junit.run(CalculatorTest.class); 
+1

有沒有包的類? – 2012-07-23 11:20:42

+2

如果'junit.run(CalculatorTest.class);'正在工作,那麼''Class.forName'的結果''''junit.run(c);'應該也能工作。當然,如羅傑指出的那樣,班級沒有任何包裹。 'Class.forName'不知道調用代碼中可能存在的任何'import'語句(當然)。 – 2012-07-23 11:20:53

+0

方面評論:你可以用'String value = ruleMap.get(選擇)替換循環+。 if(value!= null){c = Class.forName(value); }' – assylias 2012-07-23 11:23:05

回答

0

正如彼得·雷德和Peter Lawrey評論的Class.forName()將採取全名班上。 在我的情況,我的代碼應該是,

ruleMap.put("1", "package.CalculatorTest"); 

由於這兩個彼得的.. :)

+0

猜猜彼得是一個類別。 – 2012-08-15 12:17:21

0

使用完全合格的類名而不是簡單的類名!

嘗試使用:

ruleMap.put("1", CalculatorTest.class.getName()); 
ruleMap.put("2", AreaTest.class.getName()); 

問候

+1

我猜「Class.forName」被命名爲「Class.forFullQualifiedNameWithPackageAndSoOn」。 – 2012-07-23 11:29:40

+0

Map的類型參數是String,Stirng。此代碼僅用於測試目的。實際的事情是我從數據庫中獲取類名。 – Samurai 2012-07-23 11:30:39

+0

如果你可以做到這一點,你不需要Class.forName,因爲你有實際的類,也就是使用'CalculatorTest.class' – 2012-07-23 11:31:46

0

junit.run(CalculatorTest.class);意思是junit.run(Package.CalculatorTest);

所以junit.run(c)不起作用。

例如,

package cocat.test.kmt;

public static void main(String args[]) throws ClassNotFoundException { 
    String test =String.valueOf(Class.forName("cocat.test.kmt.Concat")); 
    System.out.println(test); 
} 

當運行這段代碼下面的結果顯示,

類cocat.test.kmt.Concat

相關問題