<div dir="ltr"><div><div><div><div><div><div><div>Sziasztok!<br><br>Előzetesen még egyszer leírom, hogy most már működik a dolog, de mivel hasznos dolgokat írtok, és érdekelnek a vélemények és a szép megoldás, vigyük tovább a szálat.<br>
<br></div>Alapvetően két forgatókönyv volt. Az egyiket csak zárójelben jegyeztem meg korábban, viszont most ezt fogom kifejteni. Tehát a felállás az alábbi:<br><br></div>1. Bizonyos metódusok lefutásáról statisztikát kell készítsünk. Eddig a számlálók növelése bele volt drótozva minden egyes ilyen metódusba. Szerintem abban egyetértünk, hogy ez nem volt túl jó megoldás, ezért szerettük volna AOP-vel megcsinálni. (Itt volt az első ellenvetésetek, hogy az AOP-t nem arra próbáljuk használni, amire való. Most már ismert a feladat is.)<br>
<br></div>2. Adott egy osztály, aminek ismert a forrása, de nem tudom módosítani. Tekintsünk rá úgy, mint egy 3rd party framework osztályra. Ebben van definiálva a() és b() a már ismertetett módon.<br><br></div>public abstract class FrameworkClass {<br>
</div>    public void a() {<br>        ...<br></div>        b();<br>        ...<br>    }<br></div>    public abstract void b();<br>}<br><br><div><div><div><div><div><div>3. Adott a mi kis alkalmazásunk, amiben statisztikákat kellene gyűjteni a konkrét b() hívásokról. Erre szerettünk volna egy aspectet csinálni (ami egy bizonyos annotációt meglétét ellenőrzi a pointcut-ban).<br>
<br></div><div>public class MyVeryImportantTask extends FrameworkClass {<br></div><div>    @Statistics<br></div><div>    @Override<br></div><div>    public void b() {<br>        ...<br>    }<br></div><div>}<br><br></div><div>
Ti hogyan oldanátok meg ezt a konkrét feladatot?<br></div><div><div><div><div class="gmail_extra"><br><div class="gmail_quote">2013. október 4. 16:35 Peter Verhas írta, <span dir="ltr">&lt;<a href="mailto:peter@verhas.ch" target="_blank">peter@verhas.ch</a>&gt;</span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Amikor egy osztályon belül hívsz meg egy privát metódust, akkor hiába van egy<br>
<br>
proxy -&gt; this<br>
<br>
objektumod, ahol a proxy.a() implementálja az interceptor funckcionalitást mielőtt meghívja a this.a() metódust, mert az objektumon belül a hívás, by default a this.a() metódust hívja meg.<br>
<br>
Példaképpen próbáld meg az X osztályodban egy<br>
<br>
X me;<br>
void setMe(X me){ <a href="http://this.me" target="_blank">this.me</a> = me;}<br>
<br>
setterrel beállítani, hogy ő kicsoda kívülről, onnan, ahol feteehetően a proxy-t látod, és utána a me.a()-val meghívni az a()-t. Működni fog az AOP. Persze nem ez a megoldás, hanem<br>
<br></blockquote></div><br></div><div class="gmail_extra">Péter, tulajdonképpen pont ez történik, amikor az AopContext.currentProxy()-t használjuk, csak akkor nem kívülről állítjuk be a proxyt az advised osztálynak, hanem hagyjuk, hogy ő maga kérje el a saját proxy-ját a context-ből. Nem próbáltam ki, de bizonyára a te megoldásod is működne.<br>
<br></div><div class="gmail_extra">Üdv,<br></div><div class="gmail_extra">Stivi<br><br></div></div></div></div></div></div></div></div></div></div>