Murali,
This is what actually happens. The byte-code for class C is loaded and
passed to the weaver. Before attempting to match any pointcuts references
to all super-types (classes, interfaces and aspects) are resolved.
Therefore the weaver may actually have the byte-code for classes B and A
_before_ the JVM. This process is the same whenever weaving takes place
(compile, binary, load) which is very important.The reference to the JVM
specification is not quite correct:
"Before a class is initialized, its direct superclass must be
initialized, ..."
There is documentation for using the AspectJ language, tools and APIs.
There is also some documentation to allow the extension of the compiler.
However we do not have detailed documentation on its design and
implementation.
Matthew Webster
AOSD Project
Java Technology Centre, MP146
IBM Hursley Park, Winchester, SO21 2JN, England
Telephone: +44 196 2816139 (external) 246139 (internal)
Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
http://w3.hursley.ibm.com/~websterm/
Please respond to AspectJ developer discussions <aspectj-dev@xxxxxxxxxxx>
Sent by: aspectj-dev-bounces@xxxxxxxxxxx
To: "'murvaja'" <murvaja@xxxxxxxxxxx>, "'AspectJ developer
discussions'" <aspectj-dev@xxxxxxxxxxx>
cc:
Subject: RE: [aspectj-dev] How does AspectJ implement load-time
weaving?
Murali, the Java ?language? specification guarantees that the VM will
always load the superclass of a class before it loads the class itself. So
this situation can never arise.
See step 7 at
http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.4.2
for the details of how this is guaranteed.
From: aspectj-dev-bounces@xxxxxxxxxxx
[mailto:aspectj-dev-bounces@xxxxxxxxxxx] On Behalf Of murvaja (sent by
Nabble.com)
Sent: Thursday, January 05, 2006 9:31 PM
To: aspectj-dev@xxxxxxxxxxx
Subject: [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.
_______________________________________________
aspectj-dev mailing list
aspectj-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-dev
_______________________________________________
aspectj-dev mailing list
aspectj-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-dev