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)

Hi Jan,

You might be interested in checking out the XAspects model. It's a plug-in
architecture built on top of AspectJ that allows principled extensions to
the AspectJ language. In fact, one of the next plug-ins we plan on
implementing for the project is support for multimethods. You can read
about it in this paper:

  http://www.cs.ucsd.edu/~mshonle/ddd04-shonle.pdf

which will be printed this month in OOPSLA's domain driven development
track.

-Macneil

On Sat, 4 Oct 2003, 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