Убедитесь, что фрагмент кода всегда присутствует в наборе классов Java - PullRequest
2 голосов
/ 14 марта 2011

Я должен быть уверен, что фрагмент кода выполняется во всех открытых методах классов в определенном пакете:

public String doStuff(String a, Integer b, Context c) {
   current.put(c); <--- code that need to be executed
   // business logic
   ...
}

Каков наилучший подход для обеспечения того, чтобы этот фрагмент кода всегда былприсутствует КАК ПЕРВАЯ ЛИНИЯ каждого публичного метода?

Я рассмотрел использование какого-либо инструмента статического анализа кода, такого как PMD.Кроме того, я считаю, что АОП времени компиляции может помочь.Есть еще идеи, указатели?

Я знаю, что могу использовать Аспект для этого.Проблема в том, что мое приложение использует Spring, но классы, которые мне нужно «проверить», не управляются Spring, также я бы хотел избежать изменения параметров запуска сервера, чтобы включить ткачество во время выполнения на основе аннотаций Spring.

РЕДАКТИРОВАТЬ: классы, я должен обеспечить выполнение кода являются Akka Типизированные актеры.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011

PMD - хороший вариант.Кроме того, вы можете интегрировать его с IDE, и все разработчики будут уведомлены.

Другой вариант - добавить в процесс сборки какой-либо шаг, который либо изменит исходный код с помощью некоторого регулярного выражения (или у синтаксического анализатора Java - также есть у PMD), либо добавит генерацию некоторого байтового кода с использованием таких библиотек, как ASM илиJavaAssist, который будет обрабатывать ваш код после его компиляции.

Если вы можете использовать AspectJ, то вы также можете использовать это для пост-обработки ваших файлов классов после их компиляции для проверки / добавления некоторого кода.

Если вы можете управлять созданием этого класса с помощью некоторой реализации Factory, то вы можете создать динамический прокси вокруг созданных экземпляров.

0 голосов
/ 16 марта 2011

Мне нужно передать объект "Context" на следующий слой, и я планирую использовать ThreadLocal для этого. Фрагмент должен поместить текущий контекст в локальный поток.

Если вы используете Spring, задумывались ли вы о том, чтобы сделать контекст бином в области потока? Если это через HTTP-запрос, вы можете использовать scope = "request" в bean-компоненте, и Spring будет управлять всем за вас (включая передачу bean-объекта с ограниченным объемом запроса в синглтон).

Вы можете легко создать более общую область видимости потока.

...