我試圖使用反射實現strategy pattern,即使用它的類名實例化新的具體策略對象。使用反射實現策略模式
我想要一個可配置的文件,其中包含類名。我們有一個數據庫管理器,可以在運行時進行更改。這是我到目前爲止有:
StrategyInterface intrf = null;
try {
String className = (String)table.get(someId);
intrf = (StrategyInterface) Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
return intrf;
我有一個實現StrategyInterface
一類ConcreteStrategy
。我有一個測試運行,其中table.get(someID)
返回String "ConcreteStrategy"
。
我的問題是ClassNotFoundEception
被拋出。爲什麼會發生這種情況,以及如何讓ConcreteStrategy
在給定類名的情況下實例化?我不想使用if-else
區塊,因爲具體戰略對象的數量會隨着時間和發展而增加。
編輯:我固定它通過以下方式,
String className = (String)table.get(custId);
className = TrackingLimiter.class.getPackage().getName() + "." + className;
limiter = (TrackingLimiter) Class.forName(className).newInstance();
ConcreteStrategy是否包含在類路徑中?您是否在forName()調用中使用了類的FQN(包+名稱)? – pap
發表你如何填充'表'戰略地圖。 – Hyangelo
謝謝,這工作。我感覺它會自動添加包名。但是添加包名稱起作用。 – Monir