2015-11-28 30 views
-1

使用濾波器設計模式。Java - 將字符串轉換爲接口實例

我有一個Context接口,有實現此接口的具體類,稱爲f.e.行爲目的和結構目的。

什麼我目前正試圖實現的是,當我添加CreationalPurpose類,並把它作爲前端的選項,一切都將繼續工作順利進行(過濾)

我有一個jsp即會返回「結構」,「行爲」等值。

但現在我需要創建StructuralPurpose類的實例。像Context context= new StructuralPurpose();但我不知道我是否會得到'結構'或'行爲',我不想通過添加if語句來解決此問題,主要是因爲如果有人添加新的Purpose類,那麼該人員不必添加另一個if語句對此過濾器。

這是可能的嗎?我在想也許有一個叫purposeString串並解決問題,像這樣:

String purpose = purposeString + "Purpose"; 
Context context = Class.forName(purpose).newInstance(); 

但是,這將導致到一個錯誤,說:類型不匹配:不能從捕獲#1的轉換?到上下文

那麼有沒有什麼辦法可以做到這一點?

隨着演員(Context) Class.forName(purpose).newInstance();我會得到一個ClassNotFoundException。這些課程是在不同的包,不知道這是否重要。這裏是我使用的代碼:

String behav = "filter.Behavioral"; 
    String purpo = behav+"Purpose"; 
    Context behavioral = null; 
    try { 
     behavioral = (Context) Class.forName(purpo).newInstance(); 
    } catch (InstantiationException e) { 
     System.out.println("\n basically failed"); 
    } catch (IllegalAccessException e) { 
     System.out.println("\n not allowed"); 
    } catch (ClassNotFoundException e) { 
     System.out.println("\n not found"); 
    } 

僅用於測試目的,此代碼將返回'未找到'。

+0

添加投:'上下文的背景下=(上下文)的Class.forName(目的).newInstance();' – Tunaki

+0

編輯該問題是因爲註釋會變得太長,給ClassNotFoundException – Ivaro18

+0

'Class.forName'需要完全限定的類名,而不僅僅是類名。 – Tunaki

回答

0

一般來說,允許用戶動態創建類似這樣的對象不是一種好的做法,除非您擁有對所有方面和可能例外的精確控制的有限數量的情況。
無論如何,如果你有足夠的理由這樣做,你只需要投它:

try 
{ 

    String purpose = "com.path.to.your.package." + purposeString + "Purpose"; 
    Context context = (Context) Class.forName(purpose).newInstance(); 
} 
catch(ClassNotFoundException ex) 
{ 
    ex.printStackTrace(); 
}