[aspectwerkz-user] Pointcut problem in dynamic weaving
Sebastien Vallon <[email protected]> Fri, 8 Jul 2005 15:13:46 -0500
| Newsgroups | gmane.comp.java.aspectwerkz.user |
|---|---|
| Message-ID | <[email protected]> |
Hi everybody,
I have two problems with pointcut and dynamic weaving. I think both
are related but I'll try to explain anyway.
In my application I defined a pointcut on a certain method: Pointcut
workingMethod. Inside the around advice related to this pointcut I
want to deploy an aspect I want to be executed immediately. Meaning
my aspect was defined as @After("WorkingMethod"). But when I try to
load this aspect dynamically I have this error message:
Exception in thread "main" java.lang.VerifyError: (class: core/
C_1__1709278340_1090156494___AW_JoinPoint, method: aw
$staticinitialization signature: ()V) Illegal constant pool index
at core.C.work(Unknown Source)
at Main.main(Unknown Source)
Result: 1
I suppose this error is due to the fact that at the time I try to
load the dynamic aspect, the execution point is already in the method
itself, preventing to add another aspect related to this method.
Am I right ? is there a solution to this problem ?
To overcome this problem I created an empty object with an empty
method. This method is called in the around aspect. Here is the code
I wrote:
@Around("workingMethod")
public Object framework(JoinPoint joinPoint) throws Throwable {
if( !deployed ){
hdlAfter = Deployer.deploy(aspects.TempAspect.class);
}else{
Deployer.undeploy(hdlAfter);
}
deployed = !deployed;
final Object result = joinPoint.proceed();
CallToAspect callTheAspect = new CallToAspect();
callTheAspect.callToAspect();
return result;
}
My dynamic aspects are now set to execute after the callToAspect()
method. This works. However as I may have numerous dynamic aspects I
need to identify the ones I want to execute. I was therefore thinking
at adding a cflow() to my dynamic aspect pointcut.
It used to be @Expression("execution(void callToAspect())") but I
would like it to be @Expression("execution(void callToAspect()) &&
cflow(execution(core.C.work()))") for instance. I tested it in static
mode and it works. The around aspect is considered as part of the
cflow() of the method. But in dynamic mode it fails. Here is the
exception:
Exception in thread "main" java.lang.NoClassDefFoundError: org/
codehaus/aspectwerkz/cflow/Cflow_9800697
at
framework.CallToAspect_1_541186724_2069866918___AW_JoinPoint.invoke
(Unknown Source)
at framework.CallToAspect.callToAspect(Unknown Source)
at framework.Framework.framework(Unknown Source)
at core.Work_1_1525100228_3656070___AW_JoinPoint.proceed(Unknown
Source)
at core.Work_1_1525100228_3656070___AW_JoinPoint.invoke(Unknown
Source)
at core.Work.work(Unknown Source)
at core.A.foo(Unknown Source)
at Main.main(Unknown Source)
Does anyone have an idea to solve either one or both of this problems ?
Thanks,
Sebastien