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.

Interfaces.java 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import org.aspectj.testing.Tester;
  2. import java.util.*;
  3. import org.aspectj.lang.reflect.*;
  4. public class Interfaces {
  5. public static void main(String[] args) {
  6. String v = I.staticField;
  7. Tester.checkEqual(notes, "I.staticField", "static init of I");
  8. Tester.checkEqual(v, "I.staticField");
  9. clearNotes();
  10. I i = (I)new C();
  11. Tester.checkEqual(notes,
  12. "initialize-I instanceField-A* I.instanceField privateField-A* I.privateField-from-A privateField-A* I.privateField-from-B",
  13. "inst init of I");
  14. Tester.checkEqual(i.instanceField, "I.instanceField");
  15. clearNotes();
  16. v = SubI.staticField;
  17. Tester.checkEqual(notes, "SubI.staticField", "static init of SubI");
  18. Tester.checkEqual(v, "SubI.staticField");
  19. clearNotes();
  20. SubI si = (SubI)new SubC();
  21. Tester.checkEqual(notes,
  22. "initialize-I instanceField-A* I.instanceField privateField-A* I.privateField-from-A privateField-A* I.privateField-from-B SubI.instanceField",
  23. "inst init of SubI");
  24. Tester.checkEqual(si.instanceField, "SubI.instanceField");
  25. clearNotes();
  26. i.instanceField += "-XXX";
  27. Tester.checkEqual(notes, "I.instanceField-!I||A*", "I.instanceField set");
  28. Tester.checkEqual(i.instanceField, "I.instanceField-XXX");
  29. }
  30. private static List notes = new LinkedList();
  31. public static void clearNotes() {
  32. notes = new LinkedList();
  33. //System.out.println("***********************************************");
  34. }
  35. public static String note(String note) {
  36. notes.add(note);
  37. //System.out.println(note);
  38. return note;
  39. }
  40. }
  41. class C implements I {
  42. String instanceField = "C.instanceField";
  43. }
  44. class SubC extends C implements SubI {
  45. String instanceField = "SubC.instanceField";
  46. }
  47. interface I {
  48. // must follow standard Java rules
  49. String staticField = Interfaces.note("I.staticField");
  50. }
  51. interface SubI extends I {
  52. String staticField = Interfaces.note("SubI.staticField");
  53. }
  54. aspect A1 {
  55. public String SubI.instanceField = Interfaces.note("SubI.instanceField");
  56. public String I.instanceField = Interfaces.note("I.instanceField");
  57. private String I.privateField = Interfaces.note("I.privateField-from-A");
  58. }
  59. aspect A2 {
  60. private String I.privateField = Interfaces.note("I.privateField-from-B");
  61. }
  62. aspect A3 {
  63. before(I i): !within(I||A*) && set(String I.*) && target(i) {
  64. Interfaces.note(thisJoinPoint.getSignature().toShortString()+"-!I||A*"); // +"::" + thisJoinPoint.getSourceLocation().getWithinType());
  65. }
  66. before(I i): within(I) && set(String I.*) && target(i) {
  67. Interfaces.note(thisJoinPoint.getSignature().getName()+"-I"); //toShortString());
  68. }
  69. before(I i): within(A*) && set(String I.*) && target(i) {
  70. Interfaces.note(thisJoinPoint.getSignature().getName()+"-A*"); //toShortString());
  71. }
  72. before(I i): initialization(I.new(..)) && target(i) {
  73. Interfaces.note("initialize-I");
  74. }
  75. }