[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| [aspectj-users] Mixins with @DeclareParents (M5) | 
I'm trying to implement mixins using the @Aspect/@DeclareParents 
annotations.  To begin with, the following works:
PersistentEntity.java:
public @interface PersistentEntity { }
PersistentEntityAspect.aj:
public aspect PersistentEntityAspect {
  public interface Persistent {
     long getId();
     void setId(long id);
  }
 
  declare parents : @PersistentEntity * implements Persistent;
 
  long Persistent.id = 0;
 
  public long Persistent.getId() { return id; }
  public void Persistent.setId(long id) { this.id = id; }
}
Test.java:
@PersistentEntity
public class Test { }
Using Jython, I can see that Test implements 
PersistentEntityAspect.Persistent and can call both getId() and setId().
The following does not work (replacing PersistentEntityAspect.aj with 
PersistentEntityAspect.java):
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;
@Aspect
public class PersistentEntityAspect {
  public interface Persistent {
     long getId();
     void setId(long id);
  }
 
  public class PersistentImpl implements Persistent {
     long id;
    
     public long getId() { return id; }
     public void setId(long id) { this.id = id; }
  }
 
  @DeclareParents("@PersistentEntity *")
  public static Persistent introduced = new 
PersistentEntityAspect().new PersistentImpl();
}
Test is not advised and does not implement any interface.  (I did use 
the recent thread 
http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg05032.html as 
reference, but this neither compiled (... introduced = new MoodyImpl();) 
nor did I get the advice bit working out.  I must be doing something 
simple wrong (maybe I need to post-compile the result to weave it or use 
load-time weaving?  I'm not sure how to do either (more research!))...
Other questions...  Eclipse/AJDT does not allow me to use methods 
introduced by advice.  For example, Test.java could not look as follows:
public Test {
  long test { return getId(); }
}
This actually compiles and runs correctly using ajc, but won't get 
compile in the IDE (The method getId() is undefined...).
Also, how're people using AspectJ with Maven 2?  Confessing to be a 
newbie to both AspectJ and Maven, I'm currently "tricking" it by using 
ajc as my java compiler.