Отражение действий метода в Java - PullRequest
3 голосов
/ 17 октября 2008

Я хотел бы знать, как - если вообще возможно - отразить, какие вызовы методов выполняются внутри метода во время выполнения. Меня особенно интересуют либо внешние вызовы методов (то есть методы в других классах), либо вызов какого-то определенного метода, такого как getDatabaseConnection ().

Мое намерение состояло бы в том, чтобы отслеживать действия предопределенных объектов внутри методов и выполнять дополнительный код, если выполняются некоторые конкретные условия, например, когда какой-либо метод вызывается с конкретными значениями. Монитор будет полностью внешним классом или набором классов без прямого доступа к объекту, который должен контролироваться не иначе, как отражением.

Ответы [ 3 ]

2 голосов
/ 17 октября 2008

Аспект J решит вашу проблему.

Попробуйте определить pointcut следующим образом:

pointcut profilling(): execution(public * *(..)) && (
            within(com.myPackage..*) ||

Таким образом вы перехватите все вызовы любого открытого метода в пакете com.myPackage. Добавьте столько пунктов, сколько вам необходимо.

Затем добавьте следующий код:

Object around(): profilling() {

    //Do wherever you need before method call
    proceed();
    //Do wherever you need after method call

}

Если вы хотите узнать больше о аспектеJ, следуйте этому руководству .

1 голос
/ 17 октября 2008

BCEL должен предлагать эту возможность, но ...

... ваши требования очень похожи на Аспектно-ориентированное программирование (AOP), поэтому вам, вероятно, стоит взглянуть на AspectJ Eclipse tooling ).

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

1 голос
/ 17 октября 2008

Я ожидаю, что BCEL сможет это сделать. С веб-сайта:

Библиотека байт-кода предназначен, чтобы дать пользователям удобный возможность анализировать, создавать и манипулировать (двоичными) файлами классов Java (заканчивающиеся на .class).

Важной частью здесь является "анализировать". JavaDoc не виден на веб-сайте (насколько я вижу), поэтому я не могу легко быть уверенным, поможет ли он вам, но это разумная отправная точка.

...