[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
RE: [aspectj-users] Combining AspectJ and MultiJava (multimethods)
|
> 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...
>
Easiest way to verify this is to attack it with javap, the bytecode
disassembler that ships with the JDK. Run javap -c Person right after
javac compilation, then do it again after multijava compilation and see
what's different; if nothing's changed, your assumption is right.
Nothing like getting facts to back up your assumptions.... :-)
Ted Neward
Author, Instructor, Presenter: Java and .NET
http://www.neward.net/ted/weblog
http://www.javageeks.com
http://www.clrgeeks.com
> -----Original Message-----
> From: aspectj-users-admin@xxxxxxxxxxx
> [mailto:aspectj-users-admin@xxxxxxxxxxx] On Behalf Of Jan Van Besien
> Sent: Saturday, October 04, 2003 7:18 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: [aspectj-users] Combining AspectJ and MultiJava
> (multimethods)
>
>
> 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/aspect> j-users
>