Приветствую всех. Недавно потребовалось оттрассировать вызовы
методов в системе, включая методы классов из подключаемых
библиотек. Знающие люди посоветовали AspectJ. Можно ли использовать
эту технологию с уже откомпилированными классами? Читал, что в ранних
версиях было нельзя, но разработчики планировали это в будущих версиях.
Стали ли планы реальностью? А если нет, то есть ли еще средства для полного
мониторинга вызываемых методов, передавемых в них параметров и возращаемых значений?
Здравствуйте, springborn, Вы писали:
S>Приветствую всех. Недавно потребовалось оттрассировать вызовы
S>методов в системе, включая методы классов из подключаемых
S>библиотек. Знающие люди посоветовали AspectJ. Можно ли использовать
S>эту технологию с уже откомпилированными классами? Читал, что в ранних
S>версиях было нельзя, но разработчики планировали это в будущих версиях.
S>Стали ли планы реальностью? А если нет, то есть ли еще средства для полного
S>мониторинга вызываемых методов, передавемых в них параметров и возращаемых значений?
Версия 1.5 может, более того, она может модифицировать байт код во время загрузки классов — Load-Time weaving.
Здесь можно прочитать об этом более подробно
Мы использовали aspectj для профайлинга, инструмент мощный, единственное что не понравилось — отказывается перехватывать приватные методы классов.
Пример ant-ой таски. Таска модифицирует байт код классов, которые лежат в target.jar, в результате генерит target-woven.jar, который и используется в системе. Сами аспекты лежат в ${aspects.home.dir}/src-aspects.
<taskdef
resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
<classpath>
<pathelement location="${aspectj.home.dir}/lib/aspectjtools.jar"/>
</classpath>
</taskdef>
<target name="weave-jar" description="Weave jar file">
<echo>aspectj jar: ${aspectj.home.dir}/lib/aspectjtools.jar</echo>
<iajc outjar="${jar.dest.dir}/target-woven.jar"
sourceRootCopyFilter="**/*.java, **/*.txt, **/*.aj"
verbose="true" classpathRef="main.module.classpath">
<sourceroots>
<pathelement location="${aspects.home.dir}/src-aspects"/>
</sourceroots>
<inpath>
<pathelement location="${jar.dest.dir}/target.jar"/>
</inpath>
<classpath>
<pathelement location="${thirdparty.lib}/log4j.jar"/>
<pathelement location="${aspectj.home.dir}/lib/aspectjrt.jar"/>
..........
</classpath>
</iajc>
</target>
Успехов