Динамическое приведение объекта из строки - PullRequest
1 голос
/ 03 апреля 2012

Я пишу сервлет-фильтр как решение этого вопроса:

Это хорошая идея для фильтрации внутри шаблона JSF?

Теперь идея состоит в том, чтобы создать большой фильтр для проверки всех привилегий и предоставить доступ или нет определенному пользователю. Я создаю Карту, которая содержит все привилегии для всех подприложений, и для нее в качестве ключа используется идентификатор подприложения (длинное значение), а для значения - другая Карта, которая содержит другую важную информацию. Классы контроллера называются class1Controller, class2Controller ecc, а вложенные приложения хранятся во многих папках с именем class1, class2 ecc ... Последнее, что я должен сказать, это то, что все классы имеют параметр applicationID, который является тем же ключом Map, который я упоминал ранее. Итак, что я буду делать? Я могу получить из приложения HttpServletRequest вложенное приложение, которое посетил пользователь, с помощью метода getRequestURI (), проблема в том, что я должен взять идентификатор приложения из класса, связанного с этим приложением, поэтому я написал следующий код:



    Long id= ((Class.forName(packageName+applicationName+"Controller"))session.getAttribute(applicationName+"Controller")).getApplicationId();

Проблема в том, что компилятор возвращает, что он не может найти метод getApplicationId ()! Могу ли я что-то сделать, чтобы решить эту проблему? Или я должен найти другой способ сделать это?

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Вы вызываете getApplicationId() для экземпляра Class, но у него вообще нет этого метода.

Обычный подход - позволить всем этим классам расширять некоторыеобщий базовый абстрактный класс или интерфейс, в котором определен метод, а затем приведен к этому базовому абстрактному классу или интерфейсу.

Например, с базовым абстрактным классом:

public class FooController extends BaseController {}
public class BarController extends BaseController {}

и т. Д.

Где базовый абстрактный класс выглядит следующим образом:

public abstract class BaseController {

    public Long getApplicationId() {
        return applicationId;
    }

}

Тогда вы можете получить его следующим образом:

Long id = ((BaseController) session.getAttribute(applicationName + "Controller")).getApplicationId();
1 голос
/ 03 апреля 2012

Последнее, что я должен сказать, это то, что все классы имеют параметр с именем applicationID

Звучит так, как будто вы хотите интерфейс с методом getApplicationIdв;Заставьте все контроллеры реализовывать этот интерфейс, а затем все, что вам нужно сделать, это привести к этому интерфейсу.

// TODO: Work out a better interface name than "Application" :)
Object attribute = session.getAttribute(applicationName+"Controller");
Long id = ((Application) attribute).getApplicationId();

(Возможно, вы захотите использовать абстрактный базовый класс, как описано в BalusC - это вариантыта же тема, правда.)

...