Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] hashCode() for mixin?

Hi,

I have an inter-type declaration that I think of as a mixin - it adds a
private field and some associated methods to various classes.  That works
fine.

Now I want to alter the hashCode method on the affected classes so that
the value reflects not just the state of the original class, but includes
the mixin state too.

I can think of two approaches:

- as an additional inter-type method.  The trouble here is that when I
have code like:

  public void MixinInterface.hashCode() {
    return this.state.hashCode() ^ this.hashCode();
  }

I'm going to get an infinite loop, since "this.hashCode()" is the method
I'm defining (I wondered about super.hashCode(), but doesn't that refer to
the superclass of the class I am extending?  The class I am extending
implements hashCode() itself...)

- as dynamic advice:

public aspect FieldDisplayableHash {

  pointcut miHash(MixinInterface mi):
    call(public int Object.hashCode()) && this(mi);

  int around(MixinInterface mi): miHash(mi) {
    int hash = proceed(mi);
    return hash ^ mi.state.hashCode();
  }

}

Unfortunately this doesn't work, and I don't understand why.


Please can someone point out what I'm doing wrong?  Until now, using
aspects has been pretty simple, but I seem to be stuck here.  Apologies if
this is covered somewhere in documentation that I've missed, or if
something above  is stupid.

Thanks,
Andrew






Back to the top