2012-08-13 121 views
1

我有一個關於實例化Java對象的特定方法的問題。通過反射實例化Java對象

基本上,我需要實現一個實現接口的單例。我目前嘗試使用工廠和一些反思來做到這一點,試圖重現this example(精確地說是第5篇文章)。

我喜歡的部分是通過這種方法,我可以很容易地改變Singleton的實現。

問題是我真的不明白如何檢索類名。在上面的例子中,System.getProperty()似乎是一種做到這一點的方法,但該示例並未精確顯示完成此操作所需的所有類型(該字段未輸入)。問題是我不知道給getProperty()方法的密鑰。看起來它必須是帶有.type的單身私人靜態字段的名稱(即mySingleton.name),但它似乎不起作用...

我想知道如何檢索類名。順便說一句,如果有更好的方法來做到這一點,我願意提供建議。

+0

我建議你先看看'java.util.ServiceLoader',然後沿着這條路走得太遠。 – EJP 2012-08-13 10:37:34

回答

1

typeName是String。所以你需要的是完全合格的類名稱來加載類與你一樣的反射

Class type = Class.forName(typeName);

System.getProperty()是一種訪問您在執行程序時所具有的系統屬性/環境屬性的方法。 爲了用一個例子它縮小爲你可以設置系統varible象下面這樣: 如果在窗口:

CMD>設置a.type = mytest.testclass

如果在Linux中:

$出口a.type = mytest.testclass

讓你的類,你試圖加載在classpath中。

在運行程序之前需要執行上述步驟。

即將到來的最佳實踐,上述方法可用於測試程序,但是當進入實時解決方案時,您可能會有某種方法從文件或數據庫中讀取這些類名稱。可能是某種配置參數。

1

如果是在」詢問String typeName = System.getProperty("a.type");

private synchronized static final void createA() 
{ 
    // This is just one possibility for getting the class name. 
    String typeName = System.getProperty("a.type"); 
    Class type = Class.forName(typeName); 
    a = type.newInstance(); 
} 

從何a.type的 - 它只是系統性能,在操作系統中宣佈了這一目的,只顯示

Class c = Class.forName("java.lang.String"); 

。以上 - Class.forName()需要完全合格的班級名稱 - 帶包裝聲明

+0

這正是我想知道的。我不知道它來自哪裏,它是由Java爲屬性中的每個對象生成還是通過手動設置此屬性來定義。 – JBL 2012-08-13 09:47:53

+0

設置maunaly,將Windows/Linux /作爲屬性文件處理。 – dantuch 2012-08-13 09:48:38

+1

@ user1594913如果它不是內置的屬性,那麼無論您將其設置爲在命令行中使用'-Dproperty = value'。 – 2012-08-13 09:49:19

0

您可以使物業成爲您想。你可以得到System.getProperty("my.property")屬性,你可以把它變成一個類Class.forName()

也許你可以說什麼沒有爲你工作,因爲它非常簡單,我認爲你做的事情幾乎是正確的。

+0

那麼它似乎沒有發現財產。我認爲這是一個生成的屬性(比如說,對於每個類,定義了一組屬性),而事實上它不是,然後它找不到它。我可能必須手動定義我想要instanciate的類的名稱,然後... – JBL 2012-08-13 09:54:14

+0

JVM無法知道要定義哪個屬性或要將其設置爲什麼類名。你可以做的是提供一個默認的例如'System.getProperty(「my.property」,「my.package.class」)'所以你總是得到一個類,不管它是否設置。 – 2012-08-13 09:57:45