Реализация шаблона стратегии с отражением - PullRequest
1 голос
/ 23 сентября 2011

Я пытаюсь реализовать шаблон стратегии с использованием отражения, то есть создать экземпляр нового объекта Конкретной стратегии, используя его имя класса.

Я хочу иметь настраиваемый файл с именем класса в нем. У нас есть менеджер баз данных, который сделает изменения доступными во время выполнения. Вот что у меня есть:

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();

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Предполагая, что имя класса, которое вы предоставляете для forName (), полностью определено и корректно.

ClassNotFoundException означает именно это.

Поэтому вам необходимо убедиться, что ConcreteStrategy.class (илиjar-файл, содержащий его) находится в пути к классам.

В случае, если новые классы становятся доступными действительно динамически, т. е. вы знаете, что при запуске ВАШЕЙ программы ConcreteStrategy.class не существовало, но через несколько часов / дней кто-тореализовал его и поместил полное имя класса в таблицу БД, затем вместе с именем класса вам также понадобится имя ресурса (путь ConcreteStrategy.class (или файл JAR, содержащий его)).

После того, как выИмея оба варианта, вы можете использовать URLClassLoader для создания экземпляра ConcreteStrategy из файла ConcreteStrategy.class или jar_with_ConcreteStrategy_class.jar.

Пример URLClassLoader.

2 голосов
/ 23 сентября 2011

Вы уверены, что не забыли имя пакета и класс ConcreteStrategy доступен для загрузчика классов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...