|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import org.aspectj.testing.Tester;
-
- /** @testcase replacing this or target in around advice */
- public class TargetObjectReplacement {
- public static void main(String[] args) {
- Foo f = new Foo("orig");
- // replacing target or this in advice does not affect caller reference
- f.m();
- f.n();
- f.o();
- f.p();
- Tester.checkEqual(f.idhat, "orig"); // no affect presumed
- Tester.checkAllEvents();
- }
- static {
- Tester.expectEvent("m: m-delegate");
- Tester.expectEvent("n: n-delegate");
- Tester.expectEvent("o: o-delegate");
- Tester.expectEvent("p: orig"); // no affect presumed
- }
- }
-
- class Foo {
- String id;
- String idhat;
-
- Foo(String id) {
- this.id = id;
- this.idhat = id;
- }
-
- void m() {
- Tester.event("m: " + id);
- }
-
- void n() {
- Tester.event("n: " + id);
- }
-
- void o() {
- Tester.event("o: " + id);
- }
-
- void p() {
- Tester.event("p: " + id); // before around advice on idhat get
- Tester.checkEqual(idhat, "p-delegate"); // callees affected
- }
- }
-
- aspect A {
-
- void around(Foo foo): target(foo) && call(void m()) {
- proceed(new Foo("m-delegate"));
- }
- void around(Foo foo): target(foo) && execution(void n()) {
- proceed(new Foo("n-delegate"));
- }
- void around(Foo foo): this(foo) && execution(void o()) {
- proceed(new Foo("o-delegate"));
- }
- String around(Foo foo): target(foo) && get(String Foo.idhat) && within(Foo) {
- return proceed(new Foo("p-delegate"));
- }
- }
|