2010-11-30 28 views
9

Je développe un aspect qui vérifie les arguments des méthodes setter et écrase les chaînes vides avec une valeur nulle. Ceci est mon état à ce jour:Aspectj écrase un argument d'une méthode

@Before("execution(* de.foo.entity.*.set*(..)) && args(java.lang.String)") 
public void check(final JoinPoint jp) { 
    LOGGER.debug(jp.getSignature().toLongString()); 
    Object[] args = jp.getArgs(); 
    for (int i = 0; i < args.length; i++) { 
     if (args[i] instanceof String && ((String) args[i]).isEmpty()) { 
      args[i] = null; 
     } 
    } 
}

Malheureusement, la déclaration Ecraser args[i] = null; ne fonctionne maintenant! Est-ce que quelqu'un sait comment dois-je l'écraser?

Cheers,

Kevin

+0

@Kevin btw vous pouvez remplacer this 'si (args [i] instanceof String && ((String) args [i]). IsEmpty()) 'avec ce' si ("". Equals (args [i])) ' –

+0

Merci, c'est plus rapide? Mai à cause de casting? – eglobetrotter

+0

Je ne pense pas qu'il y ait beaucoup de différence en termes de performances, mais ma version est plus lisible et donc moins sujette aux erreurs –

Répondre

-3

@Ralph vous avez tout à fait raison, la différence est que, avec un conseil autour, je suis en mesure de transmettre les args au excecution! Cela fonctionne bien maintenant!

@Around("execution(* de.foo.entity.*.set*(..)) && args(java.lang.String)") 
public void checkAroundSetter(final ProceedingJoinPoint pjp) 
    throws Throwable { 
    LOGGER.debug(pjp.getSignature().toLongString()); 
    Object[] args = pjp.getArgs(); 
    for (int i = 0; i < args.length; i++) { 
     if (args[i] instanceof String && ((String) args[i]).isEmpty()) { 
      args[i] = null; 
     } 
    } 
    pjp.proceed(args); 
} 

Hé les gens que pensez-vous de performace?

+4

Ceci n'est pas une réponse. Si vous voulez répondre à la réponse de Ralph, postez un commentaire, si vous voulez ajouter des informations supplémentaires, éditez votre question. Vous devriez supprimer cette réponse. –

+0

Mais j'ai une autre question, liée à mon sujet. – eglobetrotter

+0

puis postez une nouvelle question. SO questions sont un à la fois –

28

Je crois que vous devez mettre en place un conseil autour, au lieu d'un avant conseil.

Parce que vous pouvez utiliser avec vos nouveaux procéder arguments:

proceed(newArgs); 
+0

Merci, pourquoi dois-je implémenter un conseil autour au lieu d'avant? Où est la différence sauf qu'avec un conseil autour je suis capable de contrôler l'exécution d'une méthode, attraper des exceptions et vérifier la valeur de retour? – eglobetrotter

+7

Un conseil avant obtient une copie du tableau d'arguments, mais il ne peut pas modifier les arguments d'origine. C'est pour ça que les conseils sont pour. Ralph: +1 –