[
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