Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

21 роки тому
21 роки тому
21 роки тому
21 роки тому
21 роки тому
21 роки тому
21 роки тому
21 роки тому
21 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import org.aspectj.testing.*;
  2. public class AdviceOrdering {
  3. public static void main(String[] args) { test(); }
  4. public static void test() {
  5. new C().m();
  6. T.checkAndReset("before:aroundStart:m:aroundEnd:after:afterReturning");
  7. new C().recur(2);
  8. T.checkAndReset("P&&!cflowbelow(P):P:recur-2:P:recur-1:P:recur-0");
  9. new C().a();
  10. T.checkAndReset("C1:C2:C3:C4:A3:A4:A1:A2:B1:a");
  11. }
  12. }
  13. class T {
  14. private static StringBuffer order = new StringBuffer();
  15. public static void add(String s) {
  16. if (order.length() > 0) { order.append(':'); }
  17. order.append(s);
  18. }
  19. public static void reset() { order = new StringBuffer(); }
  20. public static void checkAndReset(String expectedValue) {
  21. Tester.checkEqual(order.toString(), expectedValue);
  22. order.setLength(0);
  23. }
  24. }
  25. class C {
  26. public void m() { T.add("m"); }
  27. public void a() { T.add("a"); }
  28. public void b() { T.add("b"); }
  29. public void c() { T.add("c"); }
  30. public void recur(int n) {
  31. T.add("recur-"+n);
  32. if (n > 0) recur(n-1);
  33. }
  34. }
  35. aspect A {
  36. pointcut cut() : target(C) && call(void m());
  37. before(): cut() { T.add("before"); }
  38. void around(): cut() {
  39. T.add("aroundStart");
  40. proceed();
  41. T.add("aroundEnd");
  42. }
  43. after(): cut() { T.add("after"); }
  44. after() returning(): cut() { T.add("afterReturning"); }
  45. }
  46. //check that P && !cflow(P) never matches anything regardless of ordering issues
  47. aspect FlowCheck {
  48. pointcut cut() : target(C) && call(void recur(int));
  49. before(): cut() && !cflow(cut()) {
  50. // should never run
  51. T.add("P&&!cflow(P)");
  52. }
  53. before(): cut() && !cflowbelow(cut()) {
  54. // should run once
  55. T.add("P&&!cflowbelow(P)");
  56. }
  57. before(): cut() && cflow(cut() && !cflow(cut())) {
  58. // should never run
  59. T.add("cflow(P&&!cflow(P))");
  60. }
  61. before(): cut() {
  62. T.add("P");
  63. }
  64. }
  65. // This cluster of aspects checks that the partial order rules work
  66. //aspect A1 dominates A2, B1 {
  67. aspect A1 { declare precedence: A1, A2 || B1;
  68. pointcut cut() : target(C) && call(void a());
  69. before(): A1.cut() { T.add("A1"); }
  70. }
  71. aspect A2 { declare precedence: A2, B1;
  72. before(): A1.cut() { T.add("A2"); }
  73. }
  74. aspect A3 { declare precedence: A3, A4, A1;
  75. before(): A1.cut() { T.add("A3"); }
  76. }
  77. aspect A4 { declare precedence: A4, A1;
  78. before(): A1.cut() { T.add("A4"); }
  79. }
  80. aspect B1 {
  81. before(): A1.cut() { T.add("B1"); }
  82. }
  83. //aspect C1 dominates C2, C3 {
  84. aspect C1 { declare precedence: C1, C2 || C3;
  85. before(): A1.cut() { T.add("C1"); }
  86. }
  87. aspect C2 { declare precedence: C2, C3;
  88. before(): A1.cut() { T.add("C2"); }
  89. }
  90. aspect C3 { declare precedence: C3, C4;
  91. before(): A1.cut() { T.add("C3"); }
  92. }
  93. //aspect C4 dominates A1, A2, A3, A4, B1 {
  94. aspect C4 { declare precedence: C4, (A1 || A2 || A3 || A4 || B1);
  95. before(): A1.cut() { T.add("C4"); }
  96. }