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)

> 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
> 




Back to the top