2011-04-02 8 views
5

Deseo acceder a una variable local desde un método en una clase ejecutiva, en un método que está en una clase de aspecto. Por ejemploAcceda a la variable local de un método de negocio en un método que está en un ASPECTO

class BusinessClass { 
    public void simpleTest() { 
     ... 
     String localString = new String("test"); 
     ... 
    } 
} 

MyAspect { 
    log() { 
     // I WANT TO ACCESS THE VALUE OF LOCALSTRING HERE 
    } 
} 

Quiero acceder al valor de localString en el método de registro de MyAspect. Por favor, avíseme si hay alguna manera de lograr esto usando Spring/AspectJ. Además, ¿hay una manera de lograr sin cambiar la firma del método de prueba simple?

¡Muchas gracias de antemano!

Respuesta

5

Según tengo entendido, los aspectos están destinados a ser aplicables a muchos métodos (como se define en el punto). Como tales, no ven las partes internas del método: solo los argumentos para el método y el resultado de ello. Esto significa que lo que desea no se puede hacer directamente, pero podría intentar refactorizar su método en dos partes, una que tome el localString como argumento y la otra que le aplique un valor predeterminado. Eso le dará un buen punto de unión conveniente para unirse. (El AspectJ reference lists join points, y las referencias a las variables locales no son una de ellas). Si haces que el método "interno" sea privado o privado, no cambiarás ni siquiera la firma generalmente comprendida del método (ya que el código externo ganó no podrá depender del método introducido).

+0

También tenga en cuenta que Spring AOP solo admite un subconjunto de AspectJ. –

15

Desafortunadamente, las variables locales no están expuestas a través de los puntos de unión. Esto significa que no puede escribir un punto para unirlas. Entonces, la respuesta es no, no puedes hacer esto directamente.

Sin embargo, si fuera a refactorizar su código para que la variable local se creara dentro de un método, entonces podría acceder a él.

Conceptualmente, este tipo de refactorización podría ser mejor para su código. En lugar de asignar simplemente una nueva variable local, puede ser explícito sobre lo que está haciendo la asignación encapsulándola en un método bien nombrado.

Por ejemplo, esto:

String localString = new String("test"); 

se convierte en esto:

String localString = allocateTestString(); // or some better name 

Con este método:

private String allocateTestString() { 
    return new String("test") 
} 

A continuación, se puede escribir un punto de corte para capturar la variable local esta manera :

after() returning(String var) : call(private String allocateTestString()) { 
    // do something fun 
} 
+0

Aunque su respuesta también es correcta, votó a Donal cuando respondió primero. Gracias de nuevo por sus entradas. – San

+0

¿es posible transferir variables de instancia a pointcut? – Irakli

Cuestiones relacionadas