AspectJ и откомпилированные классы
От: springborn  
Дата: 28.06.06 15:25
Оценка:
Приветствую всех. Недавно потребовалось оттрассировать вызовы
методов в системе, включая методы классов из подключаемых
библиотек. Знающие люди посоветовали AspectJ. Можно ли использовать
эту технологию с уже откомпилированными классами? Читал, что в ранних
версиях было нельзя, но разработчики планировали это в будущих версиях.
Стали ли планы реальностью? А если нет, то есть ли еще средства для полного
мониторинга вызываемых методов, передавемых в них параметров и возращаемых значений?
Re: AspectJ и откомпилированные классы
От: deepsky Украина  
Дата: 29.06.06 08:13
Оценка:
Здравствуйте, 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>

Успехов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.