动态创建和使用文件夹中的类

时间:2015-06-26 02:04:30

标签: java spring classpath dynamically-generated

我正在开发一个程序来标记一组学生提交的算法;每个学生都会提交自己的.java文件。

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

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

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");
        }
    }
}

Erwin 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 个答案:

答案 0 :(得分:1)

您是否看过java.lang.Class的Javadoc? 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);

您还需要处理许多已检查的异常。