Я пытаюсь реализовать шаблон стратегии с использованием отражения, то есть создать экземпляр нового объекта Конкретной стратегии, используя его имя класса.
Я хочу иметь настраиваемый файл с именем класса в нем. У нас есть менеджер баз данных, который сделает изменения доступными во время выполнения. Вот что у меня есть:
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;
У меня есть класс ConcreteStrategy
, который реализует StrategyInterface
. У меня есть тест, выполняющийся в 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();