Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Combining AspectJ and MultiJava (multimethods)

I haven't read carefully, but the fix might be as simple
as adding the aspectjrt.jar to your runtime classpath.

Can you tell us how MultiJava's declarations are better
than using AspectJ?  I'm curious because the syntax
looks identical, and AspectJ has the benefit of enforcing
aspect-relative visibility.

Thanks -
Wes


Jan Van Besien wrote:
Because I tend to like the multimethods implementation in MultiJava over the inter-type declarations in AspectJ and because MultiJava has nothing like pointcuts and advice, I was wondering if I would be able to combine the best of both worlds.

As far as I know, only AspectJ is capable of weaving aspects into bytecode. So it seamed evident that I would create some classes, aspects (aspectj) and top-level methods (multijava), and than let the multijava compiler do its job, and the aspectj compiler after that.

I created a dummy "Person" class:

Public class Person {
    public String name;
    public int age;
    //plus evident getters and setters and a constructor.
}

I added a top-level method to that class with multijava

public void Person.sayMyName () {
    System.out.println ("my name is: " + getName());
}

Then I compile (with multijava), and put the results into a jarfile together with a simple "Main" class. This "Main" class looks like this:

public class Main {
    public static void main(String[] args) {
        Person p = new Person ("Jan",21);
//multijava method
        p.sayMyName();
//java method with aspectj advice on it
        p.getAge();
    }

This all works perfectly,

Now I want some advice on the "getAge()" method:

public aspect AgeCatcher { pointcut age () : execution (public int Person.getAge());
    after () : age () {
        System.out.println ("getAge() was executed");
    }
}

I want to add that aspect to the existing bytecode in the jar file, so I call ajc with the arguments "-injar myjarfile.jar" and "-outjar myoutputjarfile.jar" and the above aspect. This works, besides a warning about being unable to update the manifest file in the jar. After updating that manifest file by hand, en executing the jar file, I receive an error:

Exception in thread "main" java.lang.NoClassDefFoundError: org/aspectj/lang/NoAspectBoundException
        at multijava.Person.getAge(Person.java:28)
        at justJava.Main.main(Main.java:21)

(Person.java:28 is the getAge() method)
(Main.java:21 is the getAge() call on p)

After thinking a very little bit about the way MultiJava compiles top-level methods into classes, I can imagine that my experiment is not so evident to work, because -to my knowledge- the bytecode of the class Person is not changed at all by the multijava compiler. But I was wondering if anyone can think of a way to make it work...

Thanks in advance for your comments,
Jan Van Besien

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




Back to the top