2011-12-30 13 views
7

¿Es posible determinar qué aspectos se enganchan en una clase dada y obtener acceso a sus instancias?Determinar qué aspectos se enganchan en una clase determinada

Algo así como:

Foo foo = new Foo(); 
List<Object> aspects = getAllAspectsOf(foo); 
+0

No estoy seguro de lo que está tratando de lograr. Por un lado, ¿qué significa ser un aspecto de foo? Quizás quiera decir que cuando se ejecuta un consejo, 'foo' estará vinculado al punto de corte 'this()'. Como los puntos de corte se pueden unir dinámicamente, cualquier método getAllAspectsOf (foo) dependerá de qué hilo y qué flujo de flujo es. Creo que deberías buscar usar perthis o pertarget. Luego, para una instancia determinada de Foo, puede llamar a MyAspect.aspectOf (foo). Ver http://eclipse.org/aspectj/doc/released/progguide/semantics- aspects.html#aspect-instantiation –

Respuesta

2

En primer lugar, lo más probable es que no pueda realizar dicha supervisión utilizando API de Aspect existentes, ya que Contenedores de aspecto que interceptan llamadas con el propósito específico de NO estar vinculado a ningún componente en particular, por lo que no habría ninguna forma natural de detectar aspectos de interceptación.

Dicho esto, podría haber una manera en que podría incluir aspectos dentro de algún tipo de clase de estrategia, sin embargo, la cantidad de trabajo para mantener esto sería bastante significativa.

http://www.eclipse.org/aspectj/doc/released/faq.php#q:benefits

Aspectos se describen a menudo como "estar en la parte superior de" o "tejida con" su otro código, es decir, en tiempo de ejecución o el tiempo de construcción.

http://asm.ow2.org/users.html

Por lo tanto, su código no sería típicamente "consciente" de cualquiera de estas funciones orientadas a aspectos, dado este paradigma para la aplicación de aspectos.

Sin embargo, si desea aspectos de trazabilidad, se podría aplicar algún aspecto "como" cuenta con el uso de Java estándar y la inyección de dependencias - es decir, por la carga de módulos en tiempo de ejecución que ponen en práctica algunas de las funcionalidades transversal inyecta de que una aspecto implementaría ... pero, sospecho, si realmente está haciendo un código serio orientado a los aspectos, este enfoque no cumpliría con sus requisitos orientados a los aspectos.

2

no creo que pueda, aunque, sería dependientes de la tecnología. Por lo que sé, no es posible con aspectj o cglib rastrear y acceder a los consejos que se tejen en torno a una clase. Puede crear su consejo de manera que agregue una referencia a sí mismo a alguna estructura local de subprocesos a la que pueda acceder la clase aconsejada. Sin embargo, parecería frustrar el propósito de los aspectos como una solución a las preocupaciones transversales si les une sus clases objetivo.

+0

No tengo la intención de unir la clase objetivo con el aspecto. En cambio, quiero proporcionar una clase de estrategia con la clase objetivo y la clase de estrategia necesita acceder al aspecto definido en la clase objetivo para registrar algún oyente. La clase objetivo no está modificada ... solo la clase de estrategia tiene conocimiento sobre el aspecto. – mibollma

+0

@mibollma: ¿Podría tener el consejo de registrar al oyente, ahorrándole tener que proporcionar la estrategia a la instancia de destino? – philwb

0

Supongo que para obtener información limitada necesitaría para cambiar el tejedor por lo que guarda algún registro de su trabajo en la clase aumentada, para que pueda leerlo más tarde. Pero no espere mucho: los aspectos de AFAIK pueden no existir como ningún tipo de tiempo de ejecución. Me pregunto, ¿hay algún marco haciendo eso?

Cuestiones relacionadas