2015-06-26 4 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.Class? Нет метода, который называется main в Class, поэтому вы не можете его так вызвать.

Если вы хотите вызвать статический метод для класса, который еще не известен во время компиляции, вам необходимо использовать 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); 

Вам нужно обрабатывать ряд проверяемых исключений, а также.

+0

Вы, сэр, джентльмен и ученый. – mysteryhobo