2015-06-26 24 views
0

我正在开发一个程序来标记由一组学生提交的算法;每个学生都会提交他们自己的.java文件。动态创建和使用文件夹中的类

我想将所有这些文件(我不知道的名字)放到一个文件夹中。然后,我的程序将实例化这些类中的每一个,将它们添加到数组列表中,以便我可以调用每个类的主要方法并标记输出。

我被告知使用弹簧框架(如下所示);但是,我仍然无法访问主要方法。这是错误:

error: cannot find symbol 
    cls.main(); 
    ^
    symbol: method main() 
    location: variable cls of type Class 
1 error 

有什么我错过了?任何帮助将不胜感激。

public class TeamMakerTester{ 
public static void main(String[] args){ 
    ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true); 
    provider.addIncludeFilter(new AssignableTypeFilter(Team.class)); 

    // scan in org.example.package 
    Set<BeanDefinition> components = provider.findCandidateComponents("org/mysteryhobo/algorithms"); 
    for (BeanDefinition component : components) 
    { 
     try{ 
      Class cls = Class.forName(component.getBeanClassName()); 
      cls.main(); //here 
     } catch (ClassNotFoundException cnfe){ 
     System.out.println("Error: Class not found"); 
     } 
    } 
} 

解决由欧文Bolwidt:

public class TeamMakerTester{ 
     public static void main(String[] args){ 
     ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true); 
     provider.addIncludeFilter(new AssignableTypeFilter(Team.class)); 

     // scan in org.example.package 
     Set<BeanDefinition> components = provider.findCandidateComponents("org/mysteryhobo/algorithms"); 
     for (BeanDefinition component : components){ 
      try{ 
       Class<?> cls = Class.forName(component.getBeanClassName()); 
      //cls.main(); 
      Method m = cls.getMethod("main", String[].class); 
      String[] params = {}; // Insert any arguments that you want to pass 
      m.invoke(null, (Object) params); 
      }catch (ClassNotFoundException cnfe){ 
       System.out.println("Error: Class not found"); 
      }catch(NoSuchMethodException me){ 
       System.out.println("Error: Method does not exist"); 
      }catch (IllegalAccessException iae){ 
       System.out.println("Error: Denied access to method"); 
      }catch (InvocationTargetException ite){ 
       System.out.println("Error: Invalid target method"); 
      } 
     } 
    System.out.println("Test"); 
    } 
} 

回答

1

你看的Javadoc java.lang.ClassClass中没有称为main的方法,因此您无法以此方式调用它。

如果要在编译时调用尚不知道的类的静态方法,则需要使用反射API。

替换cls.main(); //here有:

Method m = cls.getMethod("main", String[].class); 
String[] params = {}; // Insert any arguments that you want to pass 
m.invoke(null, (Object) params); 

你需要处理大量的checked异常的为好。

+0

你先生,是个绅士和学者。 – mysteryhobo