You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TargetObjectReplacement.java 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import org.aspectj.testing.Tester;
  2. /** @testcase replacing this or target in around advice */
  3. public class TargetObjectReplacement {
  4. public static void main(String[] args) {
  5. Foo f = new Foo("orig");
  6. // replacing target or this in advice does not affect caller reference
  7. f.m();
  8. f.n();
  9. f.o();
  10. f.p();
  11. Tester.checkEqual(f.idhat, "orig"); // no affect presumed
  12. Tester.checkAllEvents();
  13. }
  14. static {
  15. Tester.expectEvent("m: m-delegate");
  16. Tester.expectEvent("n: n-delegate");
  17. Tester.expectEvent("o: o-delegate");
  18. Tester.expectEvent("p: orig"); // no affect presumed
  19. }
  20. }
  21. class Foo {
  22. String id;
  23. String idhat;
  24. Foo(String id) {
  25. this.id = id;
  26. this.idhat = id;
  27. }
  28. void m() {
  29. Tester.event("m: " + id);
  30. }
  31. void n() {
  32. Tester.event("n: " + id);
  33. }
  34. void o() {
  35. Tester.event("o: " + id);
  36. }
  37. void p() {
  38. Tester.event("p: " + id); // before around advice on idhat get
  39. Tester.checkEqual(idhat, "p-delegate"); // callees affected
  40. }
  41. }
  42. aspect A {
  43. void around(Foo foo): target(foo) && call(void m()) {
  44. proceed(new Foo("m-delegate"));
  45. }
  46. void around(Foo foo): target(foo) && execution(void n()) {
  47. proceed(new Foo("n-delegate"));
  48. }
  49. void around(Foo foo): this(foo) && execution(void o()) {
  50. proceed(new Foo("o-delegate"));
  51. }
  52. String around(Foo foo): target(foo) && get(String Foo.idhat) && within(Foo) {
  53. return proceed(new Foo("p-delegate"));
  54. }
  55. }