2011-09-08 14 views
6

en aşağıdaki yönünü düşünelim:AspectJ ile bir yöntem çağrısı gerçekleştirerek nesne örneğini almak mümkün mü?

aspect FaultHandler { 

    pointcut services(Server s): target(s) && call(public * *(..)); 

    before(Server s): services(s) { 
    // How to retrieve the calling object instance? 
    if (s.disabled) ...; 
    } 

} 

pointcut Server kamu yöntemlere tüm çağrıları yakalayan ve bunlardan herhangi denir hemen önce before tavsiye çalışır.

Aramayı yapan nesne örneğini,numaralı öneride herkese açık Server yöntemine almak mümkün mü? Evet ise nasıl? Bu() pointcut kullanabilirsiniz

cevap

4

: Eğer kapsam bunun gerekirse Açıkçası

pointcut services(Server s, Object o) : target(s) && this(o) && call.... 

, bunun yerine Nesne belirli türü kullanabilirsiniz.

DÜZENLEME

Ayrıca thisJoinPoint değişkeni kullanabilirsiniz: thisJoinPoint genellikle belirli pointcuts kullanarak kıyasla küçük bir performans ceza tabi kullanırken

Object o = thisJoinPoint.getThis(); 

, bu durumda kullanılabilecek Arayan olduğunu statik sınıf.

Bu durumda, "bu" yoktur, yani bu (o) eşleşmeyebilir ve buJoinPoint.getThis() öğesi null değerini döndürür. kullanarak Ancak

:

Class c = thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType(); 

size statik yöntem içerir sınıfını söyleyecektir. Imza üzerinde daha fazla alan keşfetmek de size yöntem adını verebilir vs ..

+0

Bu yüzden benim yöntemimin arayıcısı emin misiniz? Sunucu yöntemi statik koddan çağrılsa bile mi? – JVerstry

+1

@JVerstry: [document] (http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html), "this' pointcut" öğesinin statik bağlamlardan herhangi bir birleşim noktalarıyla eşleşmeyeceğini belirtir. ." –

+0

Belgelerin, "statik bir yöntem çalıştırması durumunda, bunun olmaması anlamına gelir, bu yüzden bu()" kullanılarak yakalanamaz. –

İlgili konular