Несколько вещей, чтобы рассмотреть следующие вопросы:
- Правда, вы можете сделать LTW во время загрузки класса, но не после уже загружен класс.
- Нет такой концепции, как разгрузка классов, потому что для разгружаемого класса она должна быть собрана в мусор, и для этого не должно существовать никаких ссылок на класс. Даже если это было так, спецификация JVM AFAIK объявляет ее необязательной, независимо от того, будет или нет, и когда разгрузка или GC должны удалить уже загруженный класс. Вы никогда не могли бы положиться на это.
Сказав это, вы можете попробовать такие концепции, как OSGi, или написать свой собственный загрузчик классов (или найти один из многих существующих в Интернете), который загружает каждый класс или каждый JAR в отдельный экземпляр класса. Это может стать сколь угодно сложным, так что, может быть, вы хотите, чтобы рассмотреть этот простой подход, пока он находится в пределах технических границ вашей ситуации:
- компилировать ваши аспекты в ваш код или использовать LTW, это не имеет никакого значения. Просто убедитесь, что код аспекта сплетается до того, как классы фактически используются. Время компиляции, очевидно, больше, чем скоро, время загрузки всего лишь достаточно скоро, но отлично.
- Используйте
if()
pointcuts для всех соответствующих советов и предоставите средство для динамического изменения значения переменной, используемой pointcut, чтобы включить динамическое включение и выключение рекомендаций. Накладные расходы на производительность обычно минимальны, не беспокойтесь. Просто попробуйте, прежде чем говорить, что это слишком дорого.
Это решение удовлетворяет вашим условиям, что оно может быть (де) активировано динамически и что после того, как был скомпонован аспектный код, не требуется перезапуск JVM.
Я знаю, что это одна старая, но до сих пор числятся без ответа. Не могли бы вы согласиться и перенести мой ответ, если это будет уместно? Благодарю. – kriegaex