Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] AbstractMethodError calling method defined on class receiving ITD of same method

Hmmm, I had to fix up some of your sample code there as it doesn't actually work as it is. (Is Go an annotation or an aspect - you've used it as both...)

I changed it to this:
=== Foo.java
@Go
public class Foo {
  public void go() { System.out.println("go"); }
}
=== Go.java
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface Go {}
=== GoA.java
public aspect GoA {
  public interface I {}
  declare parents: (@Go *) implements I;
  public void I.go() { System.out.println("aspect-go"); }
}
=== TestFoo.java
public class TestFoo {
  public static void main(String []argv) { 
   new Foo().go(); 
  } // throws AbstractMethodError
}

Compiles and runs fine for me:

> ajc -1.5 *.java -showWeaveInfo
Type 'GoA$I' (GoA.java) has intertyped method from 'GoA' (GoA.java:'void GoA$I.go()')
Extending interface set for type 'Foo' (Foo.java) to include 'GoA$I' (GoA.java)

> java TestFoo
go

As we discussed a little the other day. An ITD on an interface is considered a 'default implementation' as the implementation a class will get that implements the interface if it does not provide its own.

If your ITD had been directly on the class then you would have gotten a clash error:
GoA.java:5 [error] inter-type declaration from GoA conflicts with existing member: void Foo.go()
public void Foo.go() { System.out.println("aspect-go"); }
                ^^
Foo.java:5 [error] inter-type declaration from GoA conflicts with existing member: void Foo.go()
public void go() { System.out.println("go"); }

If I could recreate your problem I could investigate...

cheers,
Andy








On 28 March 2013 18:09, Matthew Adams <matthew@xxxxxxxxxxxxxxx> wrote:
Hi all,

I want to make sure I haven't misunderstood AspectJ's treatment of the
following scenario, as I'm getting an AbstractMethodError in 1.7.2.
Conceptual code example follows.

@Go
public class Foo {
  public void go() { System.out.println("go"); }
}
=====
public aspect Go {
  public interface I {}
  declare parents: (@Go *) implements I;
  public void I.go() { System.out.println("aspect-go"); }
}
=====
public void TestFoo {
  @Test
  public void testGo() { new Foo().go(); } // throws AbstractMethodError
}

My current understanding is that AspectJ sees that the method "public void
go()" is already defined on a class matching the "declare parents" clause
and simply doesn't introduce the method from the aspect.  If that's correct,
then I think I'm seeing a bug.

I'm getting no compiler warnings or errors from ajc, leading me to believe
that everything is hunky dorey, then I get an AbstractMethodError upon the
call to go().

Thanks,
Matthew




--
View this message in context: http://aspectj.2085585.n4.nabble.com/AbstractMethodError-calling-method-defined-on-class-receiving-ITD-of-same-method-tp4650821.html
Sent from the AspectJ - users mailing list archive at Nabble.com.
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top