Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] @DeclareMixin matching everything (or: how to add a specific field to ALL objects)

Sorry i'm slow on this. The fact that you had to move the marker interface out of the aspect and then it started working really sounds like a bug. Can you raise one?  https://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ

cheers,
Andy


On 10 May 2013 07:55, Philipp Leitner <leitner@xxxxxxxxxxxxxxxxxxxx> wrote:
Hey guys,

I have been using AspectJ on and off for some time now, to good success. However, today I was having what seems like a relatively simple problem that took me some time to resolve. I have in the meantime found a workaround, but I would still be interested in why my original solution was not ok.

Basically, I am writing a Java-based piece of middleware that needs to keep track of objects. To this end, I want to potentially be able to inject a java.util.UUID into any Java object. To do this, I want to define a very simple Mixin:

public class IdentifiableMixin implements IIdentifiable {


private UUID id;


public UUID getPlatformId() {
return id;
}


public void setPlatformId(UUID id) {
this.id = id;
}
}

@Aspect
public class MyAspect {

public interface IIdentifiable {
UUID getPlatformId();
void setPlatformId(UUID id);
}

@DeclareMixin("*")
public static IIdentifiable createIIdentifiable() {
return new IdentifiableMixin();
}
}

Note that I wanted to match the mixin to every possible type of object, hence *. I quickly figured out that this does not work, as AspectJ then also tries to weave into enums and interfaces (which it can't). Hence, I updated to:

@Aspect
public class MyAspect {


public interface IIdentifiable {
UUID getPlatformId();
void setPlatformId(UUID id);
}


@DeclareMixin("!is(InterfaceType) && !is(EnumType)")
public static IIdentifiable createIIdentifiable() {
return new IdentifiableMixin();
}
}

Still not working, though. It seems like this is working fine as long as the classes being weaved are not part of a class hierarchy. However, as soon as two classes extend from each other, I get plenty of weave errors indicating conflicts. To me, it was not clear why this would happen. Intuitively, it seems like it should be ok if both parent and child in a class hierarchy implement the same mixin, correct? I can post the concrete errors I was getting if this is of interest.

Now, after some further experimentation I found that it seems to work if I move the interface of the mixin to a separate Java file:

public interface IIdentifiable {
UUID getPlatformId();
void setPlatformId(UUID id);
}

@Aspect
public class MyAspect {

@DeclareMixin("!is(InterfaceType) && !is(EnumType)")
public static IIdentifiable createIIdentifiable() {
return new IdentifiableMixin();
}
}

To me this was rather odd. Is this the expected behavior, and, if so, why?

thanks, /philipp

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



Back to the top