Изолировать методы с тем же именем на основе типа, используя AspectJ? - PullRequest
0 голосов
/ 14 февраля 2019

Скажем, у меня есть pointcut для метода run().

pointcut run(): execution(public void *.run());
before(): run() {
    // do something with run
}

Но я хочу поймать только некоторые случаи выполнения.Например:

new Thread(new Runnable() {
    @Override
    public void run() {
        // this run should be intercepted
    }
});

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        // this run should be ignored
    }
}, 0, 1000);

Как я могу изменить свой pointcut, чтобы забыть о run(), который не из потока?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Если вы хотите сообщить обо всех реализациях метода Runnable.run(), за исключением случаев, когда класс, обеспечивающий реализацию этого метода run, является подклассом TimerTask, это может быть эффективно выполнено с помощью следующего выражения pointcut:

execution(public void Runnable+.run()) && !execution(public void java.util.TimerTask+.run());
0 голосов
/ 14 февраля 2019

Редактировать: пока код работает, проверьте Нандор Эльде Фекете принял ответ, так как он намного эффективнее.

От AspectJ Cookbook было довольно легко вывести решение:

pointcut run(): execution(public void *.run()) && !target(java.util.TimerTask);
before(): run() {
    // do something with run, will not catch instances of TimerTask
}
...