--- /dev/null
+public class ConstructorMain { // Bug 61538
+
+ public static void main(String args[]) {
+
+ ConstructorAspects.preinitcalls = 0;
+ B b1 = new B();
+ // preinitcalls should be 2
+ // System.out.println("Preinitcalls="+ConstructorAspects.preinitcalls);
+ int bPreinitcalls = ConstructorAspects.preinitcalls;
+
+ // Only difference between B and C is the order in which the
+ // constructors are declared in the class file
+ ConstructorAspects.preinitcalls = 0;
+ C c1 = new C();
+ // preinitcalls should be 2
+ // System.out.println("Preinitcalls="+ConstructorAspects.preinitcalls);
+ int cPreinitcalls = ConstructorAspects.preinitcalls;
+
+ if (bPreinitcalls!=cPreinitcalls)
+ throw new RuntimeException("Both b("+bPreinitcalls+") and c("+cPreinitcalls+") should report the same number of preinit jps");
+ }
+}
+
+class A {
+ int x = 4;
+ A (int x) { this.x = x; }
+}
+
+class B extends A {
+ int y;
+ static int k = 4;
+ static int j = 5;
+ static int l = 6;
+
+ B (int x, int y) { super(x+y); this.y = x+y; }
+
+ B (int x) { this(x+l, x+l); this.y = x+l; }
+
+ B () { this(k+j); this.y = l; }
+
+
+}
+class C extends A {
+ int y;
+ static int k = 4;
+ static int j = 5;
+ static int l = 6;
+
+ C () { this(k+j); this.y = l; }
+
+ C (int x) { this(x+l, x+l); this.y = x+l; }
+
+ C (int x, int y) { super(x+y); this.y = x+y; }
+
+}
+
+
+aspect ConstructorAspects {
+
+ public static int preinitcalls = 0;
+ public static int initcalls = 0;
+ public static int execs = 0;
+
+ static private int aspectnesting = 0;
+ private final static boolean log = false;
+
+ static void message(String s) {
+ if (log) {
+ for (int i=0; i<aspectnesting; i++) System.out.print("---+");
+ System.out.println(s);
+ }
+ }
+
+
+ // call of all constructors
+ pointcut allconstrcalls() : call(*..new(..)) &&
+ !within(ConstructorAspects) && !call(java.lang..new(..));
+
+ // execution of all constructors
+ pointcut allconstrexecutions() : execution(*..new(..)) &&
+ !within(ConstructorAspects);
+
+ // intialization of all constructors
+ pointcut allconstrinitializations() : initialization(*..new(..)) &&
+ !within(ConstructorAspects);
+
+ // preinitialization of all constructors
+ pointcut allconstrpreinitializations() : preinitialization(*..new(..)) &&
+ !within(ConstructorAspects);
+
+ before(): !within(ConstructorAspects) && allconstrpreinitializations() {
+ preinitcalls++;
+ }
+ // before advice
+ before () : !within(ConstructorAspects) &&
+ (allconstrpreinitializations() ||
+ allconstrinitializations() ||
+ allconstrexecutions() ) {
+ message(
+ "BEFORE: " + thisJoinPointStaticPart.getSourceLocation() +
+ " " +thisJoinPointStaticPart.toLongString());
+ aspectnesting++;
+ }
+
+ // after advice
+ after () returning : !within(ConstructorAspects) &&
+ (allconstrpreinitializations() ||
+ allconstrinitializations() ||
+ allconstrexecutions() )
+ {
+ aspectnesting--;
+ message(
+ "AFTER: " + thisJoinPointStaticPart.getSourceLocation() +
+ " " +thisJoinPointStaticPart.toLongString());
+ }
+
+}