2015-12-16 2 views
3

Может кто-нибудь объяснить разницу между this() и target() pointcuts в аспекте. Я попытался найти это в другом месте, но, похоже, нет четкого ответа. Thank YouЭтот() против Target() aspectj

ответ

9

В подходящей точке соединения this() является объектом, в котором вы находитесь, target() - объект, который вы вызываете/ссылаетесь. Путаница может возникнуть из-за того, что в случае совпадения pointcut execution() в точке соединения они являются тем же самым: объект, содержащий точку соединения выполнения, которая совпадает с объектом, на котором выполняется соответствующий метод. Но в случае точки соединения call() они различны. Объект, который он вызывает, отличается от объекта, на который вызывается метод.

class A { 
    public void m() { 
    B b = new B(); 
    b.n(); 
    } 
} 
class B { 
    public void n() { 
    } 
} 

Для этой установки, срез точки execution(* m(..)) будет совпадать с точкой соединения A.m() и имеет this() типа А и target() типа А (и они будут таким же экземпляром A). Однако pointcut call(* n(..)) будет совпадать на сайте вызова в методе A.m(), где он вызывает n(), и в этот момент this() будет экземпляром A, делающим вызов, тогда как target() будет экземпляром B, к которому вызывается метод.