2012-07-02 13 views
10

Sto usando un X.jar e aggiungo al mio progetto AspectJ (in eclissi). Ho scritto pointcut e consigli per un metodo myMethod() all'interno di X.jar.Aspectj: metodo di intercettazione da jar esterno

Ma l'aspetto non sta intercettando questa chiamata di metodo.

Come posso dire a aspectj di intercettare le chiamate di metodo su jar esterni. O non è possibile?

Grazie

risposta

7

ci sono due opzioni:

a) compilare i aspetti nel barattolo
b) utilizzare il tempo di caricamento tessitura (mi piacerebbe andare con quella)

Entrambi questi sono argomenti avanzati, ti suggerisco di leggere AspectJ in Action (2nd Ed) by Ramnivas Laddad per saperne di più.

Per chiarire: esistono diversi tipi di collegamenti. Se il tuo codice chiama i metodi della biblioteca, puoi ovviamente intercettare queste chiamate, così come accadono nel tuo codice. Quindi i pointcuts call() funzioneranno, ma i pointcuts execute() (e molti altri) non lo faranno perché cambiano il metodo di esecuzione, che non è nella tua base di codice. Pertanto, è necessario modificare il codice byte della libreria (opzione a) o modificare il modo in cui viene caricato nell'applicazione (opzione b).

+0

grazie. Proverò con call() pointcut. Penso che sarà un'opzione facile per me –

+0

Ciao Sean Patrick, funzionerà su tutte le versioni di Aspectj? Funziona su Aspectj 1.5.3 ma non in 1.1.3. –

+0

@sonic Non ho idea, non ho mai usato alcuna versione di AspectJ più vecchia di 1.6.x –

0

Ecco un semplice esempio con AspectJ load-time Tessitura su GitHub https://github.com/medvedev1088/aspectj-ltw-example

Si utilizza la libreria Joda momento di dimostrare come intercettare il DateTime # toString() chiamate di metodi.

L'aspetto:

@Aspect 
public class DateTimeToStringAspect { 

    public static final String TO_STRING_RESULT = "test"; 

    @Pointcut("execution(* org.joda.time.base.AbstractDateTime.toString())") 
    public void dateTimeToString() { 
    } 

    @Around("dateTimeToString()") 
    public Object toLowerCase(ProceedingJoinPoint joinPoint) throws Throwable { 
     Object ignoredToStringResult = joinPoint.proceed(); 
     System.out.println("DateTime#toString() has been invoked: " + ignoredToStringResult); 
     return TO_STRING_RESULT; 
    } 
} 

aop.xml

<aspectj> 

    <aspects> 
     <!-- Aspects --> 
     <aspect name="com.example.aspectj.DateTimeToStringAspect"/> 
    </aspects> 

    <weaver options="-verbose -showWeaveInfo"> 
     <include within="org.joda.time.base.AbstractDateTime"/> 
    </weaver> 

</aspectj> 

prova:

public class DateTimeToStringAspectTest { 
    @Test 
    public void testDateTimeToString() throws Exception { 
     assertThat(new DateTime().toString(), is(DateTimeToStringAspect.TO_STRING_RESULT)); 
    } 
} 

configurazione del plugin infallibile da pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.9</version> 
    <configuration> 
     <argLine>-XX:-UseSplitVerifier</argLine> 
     <argLine>-javaagent:${user.home}/.m2/repository/org/aspectj/aspectjweaver/${aspectjweaver.version}/aspectjweaver-${aspectjweaver.version}.jar</argLine> 
    </configuration> 
</plugin> 
Problemi correlati