Peter,

To modify method arguments you need to use around advice with proceed (as 
you have tried). Unfortunately thisJoinPoint is read-only so you can only 
modify arguments if you access the directly with an args() pointcut. This 
means enumerating all the join points because using reflection instead of 
proceed won't work. 

You will need to use a dynamic proxy. Some AOP frameworks support this 
directly (I can't find an AspectJ enhancement) but you should be able to 
do it with AspectJ too. I haven't tried this myself (anyone else?) but 
this is what you need to do:
1. Define an interface that contains all the methods you want to intercept
2. Use declare parents ... : implements ... to add it to ULCProxy
3. Intercept the creation of instances of ULCProxy and return a Java 
dynamic proxy instead 
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Proxy.html.
4. Modify the String arguments in the invoke() method of the associated 
InvocationHandler (which is a bit like around advice)

Cheers

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, [EMAIL PROTECTED]
http://w3.hursley.ibm.com/~websterm/



"Peter Koch" <[EMAIL PROTECTED]> 
Sent by: [EMAIL PROTECTED]
27/11/2006 15:24
Please respond to
[email protected]


To
<[email protected]>
cc

Subject
[aspectj-users] around advice and modifying arguments






Hi!

I don't know how to solve the following issue
with AspectJ.

I'd like to have an advice which intercepts setter
method calls to any subclass of let's say the class ULCProxy.
I'd like then to modify then all the arguments type String
and proceed the method call with the modified arguments.

I started first with an easier example with intercepting
all calls to setter methods with exactly one String argument:

  pointcut setString(String string):
   execution(public void ULCProxy+.set*(String)) && args(string);

  void around(String string): setString(string)
  {
    if (string != null)
    {
      string = MacroExpandAspectJava.expand(string);
    }
    proceed(string);
  }

This works nice.


Now I'd like to do the same for all method calls with any
method signature but I don't know how to define this.
(e.g. setSomething(int i, boolean b, String s1, String s2))

I stopped thinking and tried instead the following approach using
a little bit of java reflection. This is my idea for the original
issue, but I don't think that it is very elegant (and of course it's
not performant and has some other upcomping problems):

  void around():  execution(public void ULCProxy+.set*(..))
  {
    Object[] args = thisJoinPoint.getArgs();
    for (int i = 0; i < args.length; i++)
    {
      if (args[i] instanceof String)
      {
        args[i] = MacroExpandAspectJava.expand((String) args[i]);
      }
    }

    //now, proceed(args); that's not ok...

    //instead: use reflection to proceed ?
    Object o = thisJoinPoint.getThis();
    Signature s = thisJoinPoint.getStaticPart().getSignature();
    String methodName = s.getName();
    Class[] paramTypes = new Class[args.length];
    for (int i = 0; i < paramTypes.length; i++)
    {
      paramTypes[i] = args[i].getClass();
    }
    try
    {
      o.getClass().getMethod(methodName, paramTypes).invoke(o, args);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }


Thanks for any help solving my issue.

Best regards,
Peter Koch, ivyTeam _______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to