Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Super's accessibility from within the advice

Hi Wes,
 
I anticipated somehow your solution, but I found the downside quite important.
 
However, the other, related issue is a Java "problem", too. If the method a1() in the super-class calls a3() in the same super-class, and a3() is overridden by the advised sub-class, you'll end by having a1() calling a3() in the sub-class.
 
 
class ClassSuperA {
 
 public void a1() {
  a3();
  System.out.println("ClassSuperA.a1()");
 }
 public void a3() {
  System.out.println("ClassSuperA.a3()");
 }
 }
 

public class ClassA extends ClassSuperA{
 
 public void a1() {
  System.out.println("ClassA.a1()");
 }
 
 public void a2() {
  System.out.println("ClassA.a2()");
 }
 
 public void a3() {
  System.out.println("ClassA.a3()");
 }
 
 public static void main(String[] args) {
  ClassA a = new ClassA();
  a.a2();
 }
}

aspect A {
 void around(ClassA a) : this(a)
  && execution(void a2()) {
   a.a2Replacement();
 }
 
 void ClassA.a2Replacement() {
  super.a1();
 }
}
 
The output is:
ClassA.a3()
ClassSuperA.a1()
 
Anyway, this is already known for java.
 
Marius
 

Wes Isberg <wes@xxxxxxxxxxxxxx> wrote:
Hi -

It's correct that there are no join points for super calls.
However, a method declared in the aspect on a type can use
super calls, and you can use around advice to completely
replace a method execution join point. So you could declare
a method that calls super and delegate to that in the
around advice that replaced a method. Awkward, and probably
knows too much about the implementation, but feasible.
Code below.

Wes

P.S. - If you only want to replace the method-execution of
the super class, then put around advice on that. You might
even use thisEnclosingJoinPointStaticPart to test whether
the caller is a subtype, and behave differently if so.

-------- output of ClassA.java
$ f=ClassA
$ aspectj-1.2 -classpath $ajrt $f.java
&& java -classpath ".;$ajrt" -Drunning=true $f
ClassSuperA.a3()

$ aspectj-1.2 -classpath $ajrt $f.java
&& java -classpath ".;$ajrt" -Drunning=false $f
ClassA.a3()
ClassSuperA.a1()
ClassA.a1()
ClassA.a2()

-------- ClassA.java
// remove "public" from ClassSuperA, include both in file

aspect A {
static boolean running() {
return Boolean.getBoolean("running");
}
void around(ClassA a) : this(a) && if(running())
&& execution(void a2()) {
a.a2Replacement();
}
void ClassA.a2Replacement() {
super.a3();
}
}



> ------------Original Message------------
> From: "Marius M."
> To: aspectj-users@xxxxxxxxxxx
> Date: Tue, Sep-28-2004 6:53 AM
> Subject: [aspectj-users] Super's accessibility from within the advice
>
> Hello,
>
> I think the following action is not possible in
> AspectJ:
>
> public class ClassSuperA {
>
> public void a1() {
> a3();
> System.out.println("ClassSuperA.a1()");
> }
> public void a3() {
> System.out.println("ClassSuperA.a3()");
> }
> }
>
> -----------------------------------------------------------
>
> public class ClassA extends ClassSuperA{
>
> public void a1() {
> System.out.println("ClassA.a1()");
> }
> public void a2() {
> super.a1();
> a1();
> System.out.println("ClassA.a2()");
> }
> public void a3() {
> System.out.println("ClassA.a3()");
> }
>
> public static void main(String[] args) {
> ClassA a = new ClassA();
> a.a2();
> }
> }
>
> ----------------------------------------------------------
>
>
> Instead of calling super.a1(), I would like to have an
> advice for the execution of ClassA.a2() that calls
> ClassSuperA.a3(); That is, to advise ClassA.a2() with
> the functionality of ClassSuperA.a1().
>
> Moreover, I think it is not possible to have access to
> the super's functionality of the advised object from
> within the advice.
>
>
> Thank you in advance for your opinions,
> Marius
>
>
>
>
>
> _______________________________
> Do you Yahoo!?
> Declare Yourself - Register online to vote today!
> http://vote.yahoo.com
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> http://dev.eclipse.org/mailman/listinfo/aspectj-users
>


_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users


Do you Yahoo!?
vote.yahoo.com - Register online to vote today!

Back to the top