当我在运行时只在字符串变量中找到它的名字时,如何使用类?

时间:2011-07-29 07:42:02

标签: java class

有没有办法从另一个类(在同一个项目中但不同的包中)运行类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());
}

4 个答案:

答案 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[] {});