[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Mixins with @DeclareParents (M5)
|
I have just fixed a but that looks very much like your problem.
See bugzilla 117681 "VerifyError when using annotations to define inter-type"
https://bugs.eclipse.org/bugs/show_bug.cgi?id=117681
The fix is in the latest AJ dev build - and I hope we can deliver it
in AJDT tomorrow.
Andy.
On 23/11/05, Brian Ericson <bme@xxxxxxxx> wrote:
> Thanks for the response!
>
> Sorry -- the "long test { getId(); } was mis-translated as I simplified
> it for the purposes of the post and should have been "public long test()
> { return getId(); } -- I'd hoped to be able to call the methods provided
> by advice in the advised classes, but while this worked outside of
> Eclipse, Eclipse+AJDT does not appear to like it (I'll try your
> suggestion to make ADJT the editor for all Java files). I've since
> removed that test, as I'm still trying to get basic annotation-style
> declare parents working.
>
> Where I'm stuck now is the java.lang.VerifierError. To be clear, I'm
> trying three scenarios. The first, using the "Adrian-style" (in his
> blog linked to previously) does not work:
> PersistentEntity.java
> ---------------------
> package test;
>
> public @interface PersistentEntity { }
>
> PersistentEntityAspect.java
> ---------------------------
> package test;
>
> 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 = 0;
>
> public long getId() { return id; }
> public void setId(long id) { this.id = id; }
> }
>
> @DeclareParents("@test.PersistentEntity test.*")
> public static Persistent introduced = new
> PersistentEntityAspect().new PersistentImpl();
> }
>
> Test.java
> ---------
> package test;
>
> @PersistentEntity
> public class Test { }
>
> The second, using the "old-style" approach works:
> PersistentEntity2.java
> ----------------------
> package test;
>
> public @interface PersistentEntity2 { }
>
> PersistentEntityAspect2.aj
> --------------------------
> package test;
>
> public aspect PersistentEntityAspect2 {
> public interface Persistent {
> long getId();
> void setId(long id);
> }
>
> declare parents : @PersistentEntity2 * implements Persistent;
>
> long Persistent.id = 0;
>
> public long Persistent.getId() { return id; }
> public void Persistent.setId(long id) { this.id = id; }
> }
>
> Test2.java
> ----------
> package test;
>
> @PersistentEntity2
> public class Test2 { }
>
> The third, using the "moody-style" also does not work:
> PersistentEntity3.java
> ----------------------
> package test;
>
> public @interface PersistentEntity3 { }
>
> Persistent.java
> ---------------
> package test;
>
> public interface Persistent {
> long getId();
> void setId(long id);
> }
>
> PersistentImpl.java
> -------------------
> package test;
>
> public class PersistentImpl implements Persistent {
> long id = 0;
>
> public long getId() { return id; }
> public void setId(long id) { this.id = id; }
> }
>
> PersistentEntityAspect3.java
> ----------------------------
> package test;
>
> import org.aspectj.lang.annotation.Aspect;
> import org.aspectj.lang.annotation.DeclareParents;
>
> @Aspect
> public class PersistentEntityAspect3 {
> @DeclareParents("@test.PersistentEntity3 test.*")
> public static Persistent introduced = new PersistentImpl();
> }
>
> Test3.java
> ----------
> package test;
>
> @PersistentEntity3
> public class Test3 { }
>
> All three compile, and Test, Test2, and Test3 each have the AspectJ
> markers indicating advice, but the following test:
> TestTests.java
> --------------
> package test;
>
> public class TestTests {
> public static void main(String[] args) {
> try {
> final Test test = new Test();
> System.out.println("test"+((test instanceof
> PersistentEntityAspect.Persistent) ? " " : "not ")+"advised");
> }
> catch (Throwable t) {
> System.out.println("test threw an exception!");
> t.printStackTrace();
> }
>
> try {
> final Test2 test2 = new Test2();
> System.out.println("test2"+((test2 instanceof
> PersistentEntityAspect2.Persistent) ? " " : "not ")+"advised");
> }
> catch (Throwable t) {
> System.out.println("test2 threw an exception!");
> t.printStackTrace();
> }
>
> try {
> final Test3 test3 = new Test3();
> System.out.println("test3"+((test3 instanceof Persistent) ? " "
> : "not ")+"advised");
> }
> catch (Throwable t) {
> System.out.println("test3 threw an exception!");
> t.printStackTrace();
> }
> }
> }
>
> gives the following result:
> test threw an exception!
> java.lang.VerifyError: (class: test/Test, method: setId signature: (J)V)
> Register pair 0/1 contains wrong type
> at test.TestTests.main(TestTests.java:6)
> test2 advised
> test3 threw an exception!
> java.lang.VerifyError: (class: test/Test3, method: setId signature:
> (J)V) Register pair 0/1 contains wrong type
> at test.TestTests.main(TestTests.java:24)
>
> I'm not sure what I'm doing wrong here...
>
> Alexandru Popescu wrote:
>
> > I am not sure about this, but the PersistentImpl shouldn't be declared
> > as static?
> >
> >
> > About Eclipse/AJDT: if you want to use directly the ITDs, I think you
> > should set the AJDT editor as the default for all .java files.
> >
> > However, I don't understand how this would look like:
> >
> > [code]
> > For example, Test.java could not look as follows:
> > >> public Test {
> > >> long test { return getId(); }
> > >> }
> > [/code]
> >
> > Haven't you missed something? (some paranthesis, I guess).
> >
> > ./alex
> > --
> > .w( the_mindstorm )p.
> >
> > #: Brian Ericson changed the world a bit at a time by saying on
> > 11/23/2005 7:30 AM :#
> >
> >> Some progress... Moving everything to a "test" package and changing
> >> the declaration to:
> >> @DeclareParents("@test.PersistentEntity test.*")
> >> is enough to get AspectJ markers in Eclipse. However, an attempt to
> >> construct an instance of Test fails with the following exception:
> >> java.lang.VerifyError: (class: test/Test, method: setId signature:
> >> (J)V) Register pair 0/1 contains wrong type
> >>
> >> I also reworked the "moody" example (in the documentation and sited
> >> in a thread below) using a Persistent interface and PersistentImpl
> >> implementation outside of the aspect, allowing me to do the following:
> >> package test;
> >>
> >> import org.aspectj.lang.annotation.Aspect;
> >> import org.aspectj.lang.annotation.DeclareParents;
> >>
> >> @Aspect
> >> public class PersistentEntityAspect {
> >> @DeclareParents("@test.PersistentEntity test.*")
> >> public static Persistent introduced = new PersistentImpl();
> >> }
> >>
> >> This fails with the same exception above. What am I doing wrong?
> >> This works for Adrian... (see
> >> http://www-128.ibm.com/developerworks/java/library/j-aopwork8/ ).
> >>
> >> Brian Ericson wrote:
> >>
> >>> 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.
> >>> _______________________________________________
> >>> aspectj-users mailing list
> >>> aspectj-users@xxxxxxxxxxx
> >>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >>>
> >> _______________________________________________
> >> aspectj-users mailing list
> >> aspectj-users@xxxxxxxxxxx
> >> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >>
> >
> > _______________________________________________
> > aspectj-users mailing list
> > aspectj-users@xxxxxxxxxxx
> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>