有没有办法从另一个类(在同一个项目中但不同的包中)运行类X的方法,当我只将类X的名称存储在一个String中时 - 说我不知道在我的程序启动之前存在哪些类我扫描目录中的.java文件,然后将这些名称存储到字符串中。
例如,我有一个类A,它有函数'main'和'method1' - 我的程序从它的文件中获取类A的名称到String s。然后我希望能够运行main或method1函数,但我不确定如何操作s到达那里...我尝试过的一件事就是这个但是我只是得到了Exception错误而且不知道它是否在正确的轨道,任何建议?:
//gets the filename from JFileChooser method_fc
File file = method_fc.getSelectedFile();
try {
Class c = Class.forName(file.getName());
Method method = c.getDeclaredMethod("main");
Object instance = c.newInstance ();
Object result = method.invoke(instance);
} catch (Exception e) {
System.out.println("Cannot access class: "+e.getMessage());
}
答案 0 :(得分:2)
你可以这样做,但要考虑到类名不以“.java”或“.class”结尾(你可以删除它)。
答案 1 :(得分:2)
我的猜测是你的main
方法有一个String[]
参数,但你没有提供它 - 或者它是一个静态方法,但你正试图将其称为实例方法。
但是,如果没有看到或类的错误信息,很难说清楚。
正如Fernando所说,类的名称与文件名不同 - 不仅文件名以“.class”结尾,而且可能还涉及包 - 文件“Foo.class “实际上可能包含一个类”com.acme.Foo“。
编辑:如评论中所述,该课程也需要在课程路径中,或者需要特殊的ClassLoader
。
答案 2 :(得分:0)
请报告异常的完整堆栈。
我猜你的main方法至少接收一个字符串数组作为参数。此外,main方法通常不返回任何结果,因为它被定义为void。 为什么不将args传递给方法调用?
String[] args = new String[1]
Object result = method.invoke(instance, args);
请至少报告主要方法的声明。
的问候,
卢卡
答案 3 :(得分:0)
main
通常是带有static
参数的String[]
方法。如果是这样,您不需要实例 - 使用Class对象本身作为目标对象。
此片段适用于标准main
方法:
Class<?> c = Class.forName("com.company.SomeClass");
Method method = c.getDeclaredMethod("main", String[].class);
method.invoke(c, (Object) new String[] {});