2011-07-29 80 views
2

當我只將類X的名稱存儲在字符串中時,是否有方法從另一個類(在同一個項目但不同的包中)運行X方法的方法 - 說我不知道​​什麼類存在,直到我的程序啓動,我掃描.java文件的目錄,然後將這些名稱存儲到字符串中。因此,例如我有類A,它具有函數'main'和'method1' - 我的程序從它的文件中獲取類A的名稱到字符串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()); 
} 
+3

建議1:文章中的完整例外,不只是「我只是得到了異常錯誤」。 –

+0

第一次猜測:從文件名剝離.java或.class ... –

回答

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[] {}); 
+0

謝謝,這適用於我想要做的事情。也感謝其他回覆,所有信息都給了我一個更好的工作方式 - 對不起,沒有指定,是的,我的主要方法是靜態的,接收一個字符串數組作爲參數,並且不返回一個值 – Alaph432

2

你可以這樣做,但考慮到類名不符合「的.java」或「的.class」(你可以將其刪除)結束。

2

猜測是你main方法有String[]參數,但你沒有提供它 - 或者這是一個靜態方法,但是你要稱呼其爲實例方法。

但是,如果沒有看到類錯誤消息,很難說。費爾南多指出,類的名稱與文件的名稱不同 - 不僅文件名以「.class」結尾,也可能有涉及的包 - 文件「Foo」。類「實際上可能包含一個類」com.acme.Foo「。

編輯:正如評論中指出的那樣,該類還需要在類路徑中,否則將需要特殊的ClassLoader

+2

還值得一提的是,該類應該位於類路徑中。從這個代碼示例中,用戶可以選擇系統上的任何類文件。 –

0

請舉報異常的完整堆棧。

我想你的主要方法接收參數至少是一個字符串數組。此外,主方法通常不會返回任何結果,因爲它被定義爲void。 爲什麼你沒有將args傳遞給方法調用?

String[] args = new String[1] 
Object result = method.invoke(instance, args); 

請至少報告主要方法的聲明。

問候,
盧卡

相關問題