2015-05-23 128 views
-1

我想創建接口和實現此接口的x類。而當程序運行時,我想創建一個新的對象,它是這個類的實例之一,該類在.properties文件中設置。它甚至有可能嗎?自定義屬性文件和創建類取決於屬性

比如我有接口

public interface A{ 
     void a(); 
    } 

    class B1 implements A{ 
     void a(){} 
    } 

    class B2 implements A{ 
     void a(){} 
    } 

    A m = ? 

而且我不知道是否有可能創建類,這是在某種程度上對象定義的屬性?

+1

「是」。你有更具體的問題嗎?你看了什麼或嘗試過什麼,有什麼或沒有工作? –

+0

該問題僅討論反射作爲選項,這不是解決此問題的唯一可能選項。 – John

回答

0

您可以使用if或switch屬性文件中的值與工廠方法模式進行切換。

或者你可以使用反射:

Class.forName, getConstructor and newInstance calls. 

這裏是工廠的一個例子:

public class Factory { 

    public static A getA(String propertyValue) { 

     switch(propertyValue) { 

     case "B1": return new B1(); 
     case "B2": return new B2(); 
     default: throw new RuntimeException("unsupported class"); 

     } 

    } 
} 

您也可以在B1和B2緩存實例,如果他們是安全,可以在線程之間共享,並始終返回這些緩存的實例。

我肯定會選擇與工廠的選擇,如果你是一個提供接口A.

使用反射的實現只如果你不能以任何其他方式解決問題。在你的情況下,爲其他人提供框架以提供他們自己的實現A,這將從屬性文件中選擇。既然你事先不知道這些類的名字,你就必須使用反射。