Определить pointcut для доступа члена и вызова функции - PullRequest
2 голосов
/ 01 декабря 2010

это довольно сложно объяснить, но я хочу определить в AspectJ pointcut при вызове функции, подобной этой:

public class B{
    public A a;
}

public class A{
    public void foo(){...}
}

и pointcut должен перехватить следующий вызов:

B.a.foo();

Я до сих пор не нашел способ сделать это (если есть). У кого-нибудь есть идеи?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Я тоже новичок в AspectJ, но у меня такое чувство, что это невозможно.Даже если вы разработали точечный вырез, который соответствует B.a.foo(), вам все равно придется каким-то образом обрабатывать следующий случай:

A a = b.a;
a.foo();

или даже

public void fooA(A aToFoo) { aToFoo.foo(); }

public void whatever(B someB) { fooA(someB.a); }
0 голосов
/ 09 декабря 2010

Как уже упоминалось, это невозможно в AspectJ. Тем не менее, есть некоторые исследовательские расширения AspectJ, которые представляют трассировки, которые представляют собой новый тип pointcut, способный выполнять именно то, что вы просите. Я не верю, что есть какие-либо реализации, готовые к работе, но вам может быть интересно узнать об этом. Хорошая статья здесь:

http://lsmr.cpsc.ucalgary.ca/papers/walker-fse-2004.pdf

0 голосов
/ 01 декабря 2010

Вы можете определить pointcut, который перехватывает любую ссылку на публичное поле, но AFAIK вы не можете создать тот, который объединяет ссылку на поле с вызовом метода для этой ссылки.

...