2012-07-23 33 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

相关问题