鏡像自
https://github.com/eclipse-aspectj/aspectj.git
synced 2024-08-26 17:58:43 +02:00
![jhugunin](/assets/img/avatar_default.png)
can't conflict with default constructors instance variables aren't initialized unless you call this
163 行
5.8 KiB
Java
163 行
5.8 KiB
Java
import org.aspectj.testing.Tester;
|
|
|
|
/** @testcase PR#555 inner classes of privileged aspects cannot see target class private members */
|
|
public class InnerClassInPrivilegedAspect {
|
|
public static void main(String[] args) {
|
|
Util.start();
|
|
Target.main(args);
|
|
new Target().toString();
|
|
Util.end();
|
|
}
|
|
}
|
|
|
|
class Util {
|
|
public static void event(String s) {
|
|
//System.out.println(s);
|
|
Tester.event(s);
|
|
}
|
|
public static void start() {
|
|
// failing
|
|
Tester.expectEvent("before runner1");
|
|
Tester.expectEvent("before intro1");
|
|
Tester.expectEvent("new1");
|
|
Tester.expectEvent("around runner1");
|
|
Tester.expectEvent("around intro1");
|
|
Tester.expectEvent("before instance1");
|
|
Tester.expectEvent("around instance1");
|
|
Tester.expectEvent("pcd if()1");
|
|
Tester.expectEvent("before run1");
|
|
Tester.expectEvent("around run1");
|
|
|
|
// passing
|
|
Tester.expectEvent("before pcd if()1");
|
|
Tester.expectEvent("before1");
|
|
Tester.expectEvent("around1");
|
|
}
|
|
public static void end() {
|
|
Tester.checkAllEvents();
|
|
}
|
|
}
|
|
|
|
class Target {
|
|
private Target(String foo) {}
|
|
private static int privateStaticInt = 1;
|
|
private int privateInt = 1;
|
|
public static void main(String args[]) { }
|
|
}
|
|
|
|
interface Test {
|
|
public boolean t();
|
|
}
|
|
privileged aspect PrivilegedAspectBefore {
|
|
pointcut p() : execution(static void Target.main(..));
|
|
|
|
static class IfTest {
|
|
public boolean t(){ Util.event("pcd if()"+Target.privateStaticInt); return true;}
|
|
}
|
|
|
|
pointcut q() : p()
|
|
&& if(new IfTest().t());
|
|
|
|
|
|
before() : q() { Util.event("before pcd if()" + Target.privateStaticInt); }
|
|
|
|
/** @testcase privileged access to target private static variables in introduced member (of anonymous class type)*/
|
|
static Runnable Target.runner = new Runnable() {
|
|
public void run() { Util.event("before runner"+Target.privateStaticInt); }
|
|
};
|
|
before() : p() { Target.runner.run(); }
|
|
|
|
before() : p() {
|
|
/** @testcase privileged access to target private static variables in before advice (ok) */
|
|
Util.event("before" +Target.privateStaticInt);
|
|
}
|
|
before() : p() {
|
|
/** @testcase privileged access to target private static variables from inner class inside before advice */
|
|
Runnable inner = new Runnable() {
|
|
public void run() {
|
|
Util.event("before run" +Target.privateStaticInt);
|
|
}
|
|
};
|
|
inner.run();
|
|
}
|
|
|
|
/** @testcase privileged access to target private static variables from inner class inside introduced method */
|
|
before() : p() { Target.runbefore(); }
|
|
static void Target.runbefore() {
|
|
Runnable inner = new Runnable() {
|
|
public void run() {
|
|
Util.event("before intro" +Target.privateStaticInt);
|
|
}
|
|
};
|
|
inner.run();
|
|
}
|
|
}
|
|
/** differs from PrivilegedAspectBefore only in using around advice */
|
|
privileged aspect PrivilegedAspectAround {
|
|
pointcut p() : execution(static void Target.main(..));
|
|
|
|
/** @testcase privileged access to target private static variables from inner class in introduced constructor */
|
|
Target.new() {
|
|
this("hi");
|
|
int i = privateStaticInt;
|
|
Runnable p = new Runnable() {
|
|
public void run() { Util.event("new"+Target.privateStaticInt); }
|
|
};
|
|
p.run();
|
|
}
|
|
/** @testcase privileged access to target private static variables in introduced member (of anonymous class type)*/
|
|
static Runnable Target.runner2 = new Runnable() {
|
|
public void run() { Util.event("around runner"+Target.privateStaticInt); }
|
|
};
|
|
Object around() : p() { Target.runner2.run(); return proceed();}
|
|
Object around() : p() {
|
|
/** @testcase privileged access to target private static variables in before advice (ok) */
|
|
Util.event("around" +Target.privateStaticInt);
|
|
return proceed();
|
|
}
|
|
Object around() : p() {
|
|
/** @testcase privileged access to target private static variables from inner class inside around advice */
|
|
Runnable inner = new Runnable() {
|
|
public void run() {
|
|
Util.event("around run" +Target.privateStaticInt);
|
|
}
|
|
};
|
|
inner.run();
|
|
return proceed();
|
|
}
|
|
|
|
Object around() : p() { Target.runaround(); return proceed(); }
|
|
/** @testcase privileged access to target private static variables from inner class inside introduced method */
|
|
static void Target.runaround() {
|
|
Runnable inner = new Runnable() {
|
|
public void run() {
|
|
Util.event("around intro" +Target.privateStaticInt);
|
|
}
|
|
};
|
|
inner.run();
|
|
}
|
|
}
|
|
|
|
privileged aspect PrivilegedAspectAroundNonStatic {
|
|
/** @testcase privileged access to target private variables from inner class inside introduced method */
|
|
before(Target t) : call(String Object.toString()) && target(t){ t.runbefore2(); }
|
|
void Target.runbefore2() {
|
|
Runnable inner = new Runnable() {
|
|
public void run() {
|
|
Util.event("before instance" +privateInt);
|
|
}
|
|
};
|
|
inner.run();
|
|
}
|
|
/** @testcase privileged access to target private variables from inner class inside introduced method */
|
|
Object around(Target t) : call(String Object.toString()) && target(t){ t.runbefore3(); return proceed(t); }
|
|
void Target.runbefore3() {
|
|
Runnable inner = new Runnable() {
|
|
public void run() {
|
|
Util.event("around instance" +privateInt);
|
|
}
|
|
};
|
|
inner.run();
|
|
}
|
|
}
|