Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-dev] How does AspectJ implement load-time weaving?

I've been trying to understand how AspectJ manages to match the '+' pointcut construct at runtime for load-time weaving. The example I have in mind is for the Hotspot JVM 1.5, with load-time weaving enabled through the -javaagent option, and goes as follows.

Say I have a class hierarchy like this:

public class A
{
   public void foo(){}
}  

public class B extends A
{
   
}  

public class C extends B
{
    public void foo(){}
}  

And I write a pointcut and advice as follows:

pointcut pc() : execution (* A+.foo() )

before() : pc() {
//weaving code here
...
}

According to the pointcut definition, all subclasses of A will match the pointcut, so the load-time weaving should insert the weaving code at the beginning of both A.foo and C.foo. This will happen at their respective class-load times, that is, A.foo will be weaved when A is loaded and C.foo will be weaved when C is loaded.

My question is, how does the weaver do this if C is loaded before A and B, like in the following code (assume none of A, B or C can be loaded by the system class loader) ?


public static void main (String args[])
{
   ClassLoader loader = new MyClassLoader();
   loader.loadClass("C");
}


At the time C is loaded, the weaver will have C's bytes at hand and will have to decide whether to weave them or not. According to the pointcut definition, the bytecodes should be weaved because C is of type A. However, the weaver cannot know that at this time, because the C bytecode only contains a reference to its direct superclass B (not A), and the bytes for B are not yet available because B is not yet loaded.

Any leads? I've been trying to find documentation on this but to no avail. Thanks in advance,

-Murali


View this message in context: How does AspectJ implement load-time weaving?
Sent from the AspectJ - dev forum at Nabble.com.

Back to the top