java - Calling methods declared in an aspect -
this page shows how 1 can add methods existing classes , shows how declare methods inside aspect call additional methods.
this code page:
aspect pointobserving { private vector point.observers = new vector(); public static void addobserver(point p, screen s) { p.observers.add(s); } public static void removeobserver(point p, screen s) { p.observers.remove(s); } pointcut changes(point p): target(p) && call(void point.set*(int)); after(point p): changes(p) { iterator iter = p.observers.iterator(); while ( iter.hasnext() ) { updateobserver(p, (screen)iter.next()); } } static void updateobserver(point p, screen s) { s.display(p); } } i trying reuse pattern in same setting (observer pattern) want able add observers anywhere in java code. thus, in example shown on page, want class in package:
point p = new point(120, 230); screen s = getscreen(); pointobserving.addobserver(p, s); however, "aspect" pointobserving not visible java classes (though have declared public).
i found way --apparently aspectj allows not define fields methods. so, need modify aspect below (note how have replaced static point.)
aspect pointobserving { private vector point.observers = new vector(); public void point.addobserver(point p, screen s) { observers.add(s); //legal access observers here } public void point.removeobserver(point p, screen s) { observers.remove(s); //legal access observers here } //rest remains same before. } now somewhere in normal java class can this:
point p = new point(120, 230); screen s = getscreen(); p.addobserver(s); also, worthwhile declaring observers weak references. thus,
private collection<screen> point.observers = collections.newsetfrommap(new weakhashmap<screen, boolean>()); //rest remains same
Comments
Post a Comment