2010-11-04 7 views
6

¿Por qué usa el siguiente código:¿Por qué recibí una advertencia de "aviso no se ha aplicado"?

pointcut callsToList() : call(* List.*(..)); 

before(List l) : callsToList() && target(l) { 
    System.out.println("cool"); 
} 

genera la siguiente advertencia: no se ha aplicado

consejos definido en org.eclipse.ajdt.examples.ListAdvice [Xlint: adviceDidNotMatch]

Estoy trabajando con Eclipse. Instalé eclipse aspectj plugin y, por supuesto, mi proyecto es un proyecto aspectj.

Editar: Además me comenzó a partir de un ejemplo de trabajo proporcionada por ajdt plugin:

pointcut callsToBeginTask() : call(void IProgressMonitor.beginTask(..)); 
before() : callsToBeginTask() { 
    System.out.println("cool"); 
}; 

No puedo ver ninguna diferencia, excepto el hecho de que este ejemplo funciona sin previo aviso ...

+0

¿Tal vez esto esté relacionado con la política de carga de clases de Eclipse/OSgi? ¿Cómo funciona aspectj para enganchar los puntos de corte provistos? –

+0

¿Puedes mostrar el código que debe ser urdido por el consejo? – Espen

+0

No estoy seguro de entender su solicitud. Quiero que se llame a este consejo en una aplicación de Eclipse que ejecuta varios complementos personalizados. Por lo tanto, el código que quiero "analizar" está dividido en muchos complementos/paquetes/clases. –

Respuesta

3

Cuando se desea AspectJ para trabajar en un entorno OSGi, debe utilizar Aspectos Equinox (también conocido como equinoccio de tejido). Esta es una forma de tejer el tiempo de carga que funciona con cargadores de clases de osgi.

Este tutorial es un poco fuera de fecha, pero debe empezar:

http://www.eclipse.org/equinox/incubator/aspects/equinox-aspects-quick-start.php

Cuando sus aspectos están todos dirigidos en el mismo proyecto, que no necesitan Aspectos Equinox. El tendido de tiempo de compilación regular servirá, pero para abarcar múltiples paquetes/complementos, esto no funcionará.

2

Mi conjetura es que debido a que la lista es una interfaz y que desea hacer coincidir las llamadas a todas las clases que se extienden tendría que utilizar esta sintaxis:

pointcut callsToList() : call(* List+.*(..)); 

actualización: OK, lo tengo para trabajar con este Versión:

pointcut callsToList(List list) : 
    call(* java.util.List+.*(..)) && target(list); 

Object around(List l) : callsToList(l) { 
    // code here 
} 

Esto también funciona:

before(List l) : callsToList(l) { 
    // code here 
} 
+0

Su respuesta no resuelve mi problema. Además, comencé con un ejemplo de trabajo proporcionado por el plugin de ajdt: \t llamadas de corte puntualToBeginTask(): call (void IProgressMonitor.beginTask (..)); \t \t antes(): callsToBeginTask() {}; –

+0

Este ejemplo no genera ninguna advertencia incluso si IProgressMonitor es una interfaz. –

+0

ver mi respuesta actualizada, esto funciona para mí. acerca de las cosas del monitor de progreso: por favor ponga eso en su pregunta (o una pregunta por separado) si quiere que se responda. –

Cuestiones relacionadas