在文件夹中动态创建和使用 类
Dynamically creating and using classes in a folder
我正在开发一个程序来标记一组学生提交的算法;每个学生将提交自己的 .java 个文件。
我想将所有这些文件(我不知道它们的名字)放在一个文件夹中。然后我的程序将实例化每个 classes,将它们添加到数组列表中,这样我就可以调用每个 class 的主要方法并标记输出。
有人告诉我使用 spring 框架(如下所示);但是,我仍然无法访问主要方法。这是错误:
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");
}
}
你看过 java.lang.Class
的 Javadoc 了吗? 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);
您还需要处理一些已检查的异常。
我正在开发一个程序来标记一组学生提交的算法;每个学生将提交自己的 .java 个文件。
我想将所有这些文件(我不知道它们的名字)放在一个文件夹中。然后我的程序将实例化每个 classes,将它们添加到数组列表中,这样我就可以调用每个 class 的主要方法并标记输出。
有人告诉我使用 spring 框架(如下所示);但是,我仍然无法访问主要方法。这是错误:
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");
}
}
你看过 java.lang.Class
的 Javadoc 了吗? 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);
您还需要处理一些已检查的异常。