2013-08-27 92 views
1

我想創建一個方法,它將基於給定的接口實例化一個類。目前我正在嘗試基於類名來實例化一個類,但我一直在收到ClassNotFoundException用反射在Java中實例化一個類

誰能告訴我我做錯了什麼?

public class Message implements IExample{ 
    @Override 
    public String showMessage() { 
     return "merge"; 
    } 
} 

public static void main(String[] args) throws Exception{ 
    Object mess = Class.forName("Message").newInstance(); 
} 

編輯

我曾嘗試:

Object mess = Class.forName("com.MyExample.Message").newInstance(); 
Object mess = Class.forName("Project.MyExample.Message").newInstance(); 
Object mess = Class.forName("MyExample.Message").newInstance(); 

他們都扔ClassNotFoundException並告訴我一個窗口 「源未找到」 一個按鈕(編輯源查找路徑.. )讓我來瀏覽文檔。

兩個主類和Message類是在一個名爲「工程」項目和一個包叫做MyExample

+0

你確定類'Message'在類路徑上嗎?另外,您需要完整的類名稱; 'com.whatever.Message' – raffian

+0

你的包裹是什麼?你的'Message.class'居住在哪裏? – user902383

+0

類是Message還是普通類中的主要方法?如果是這樣,請看看這裏:http://stackoverflow.com/questions/2097982/is-it-possible-to-create-an-instance-of-nested-class-using-java-reflection –

回答

4

你需要指定完全合格的類名Class.forName(String)

參數: className所需類的完全限定名稱。

如果Message在包com.package中,那將是com.package.Message

Object mess = Class.forName("com.package.Message").newInstance(); 

啓動應用程序時,該類必須位於類路徑中。

2

如果您的消息類在一個包中,則需要指定全名,例如edu.myschool.mypackage.Message

0

您需要提供該類的標準名稱。如果Message在包x.y那麼你必須提供x.y.Message

Object mess = Class.forName("x.y.Message").newInstance(); 
0

類名稱不應包含ProjectName,只是在src文件夾中定義的包名稱結構。

如果您使用的是Eclipse,請確保您在項目中正確定義了src文件夾。 Here是如何更改您的應用程序的src文件夾(如果需要)。

結構應該是這樣的:

Project 
| 
+-src 
| | 
| +-com 
| | 
| +-MyExample 
|  | 
|  +-MyClass 
+-build 

在這種情況下,你應該能夠說

Class.forName("com.MyExample.MyClass").newInstance();

這是非常重要的是如何你src文件夾結構定義並確保在IDE項目設置中定義了正確的src文件夾。