2014-04-27 10 views
8

ok to pytanie nigdy wcześniej nie było zadawane w Internecie, a więc tutaj: Uczę się języka Java (poziom początkujący-średniozaawansowany) i postanowiłem przejść do programu klasowego, wypróbowując programowanie zorientowane na aspekt.Programowanie zorientowane na aspekt w Javie BEZ AspectJ?

Teraz ta sprawa ma być łatwa do nauczenia się (przynajmniej to konsensus internetowej) tak bardzo, że „aspekty” Mówi się, że nieznacznie zmodyfikowane wersje standardowych klas więc moje pytanie brzmi: czy aspektów są w zasadzie klasy,

DLACZEGO musimy zainstalować AspectJ, aby zrobić AOP w Javie?

jako że dodaje dodatkową warstwę złożoności sprawiając, że pojęcie jest jeszcze trudniejsze do uchwycenia.

Czego chcę, to móc napisać aspekt bez użycia AspectJ (lub jakiegokolwiek innego dodatku), innymi słowy chcę zrobić AOP przy użyciu tylko podstawowych klas Javy w języku Java &. czy to możliwe i jeśli tak, jak mam napisać te zajęcia?

+2

Tak, oczywiście. Nie potrzebujesz nawet innego frameworka (np. Spring AOP). W teście czasu AspectJ nie przybierał rozpędu przy okazji. Atrybuty + odbicie mogą na przykład być sposobem na wykonanie AOP dla frameworka. –

+1

tak dobre pytanie .. możemy napisać rodzaj refleksji kodu i użyć wyrażenia regularnego, aby wywołać metody oparte na instrukcjach jak przed, po i wokół .. możemy obejść to, ale potrzebuje trochę więcej czasu .. –

+0

alrite dzięki chłopaki. wygląda na to, że mam dość długą drogę, bo refleksja i takie (związane z introspekcją) są na chwilę poza moim zasięgiem. lol Przypuszczam, że innym sposobem zadawania mojego pytania byłoby przekonwertowanie (prostego) programu z kodowaniem AspectJ do programu czysto Java tylko z jak najmniejszymi modyfikacjami? – user3578836

Odpowiedz

3

Java nie obsługuje AOP po wyjęciu z pudełka i nie polecałabym jego implementacji na własną rękę, ponieważ będziesz musiał modyfikować pliki klas podczas ich ładowania. Alternatywnie można również zmodyfikować zgodne pliki klas, ale byłoby to jeszcze bardziej skomplikowane.

AspectJ używa agenta Java do skonfigurowania programu ładującego klasy (który modyfikuje pliki klasy podczas ładowania), ale można również ręcznie użyć modułu ładującego klasy. Jeśli twoje zajęcia, które chcesz zmodyfikować, wszystkie implementują interfejs, możesz użyć A02 do uzyskania Java Proxies. W przeciwnym razie będziesz musiał użyć zewnętrznej biblioteki, takiej jak CGLib, Javassist lub ASM (lub dowiedzieć się, jak działa kod bajtowy Java).

Niektóre dalsze informacje:

Proxy przykład:

import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 

public class ProxyExample { 

    public static void main(String[] args) { 
     AnInterface obj = new AClass(); 
     AnInterface proxyObj = createProxy(obj); 
     System.out.println(obj.aMethod()); 
     System.out.println(proxyObj.aMethod()); 
    } 

    private static AnInterface createProxy(AnInterface obj) { 
     return (AnInterface) Proxy.newProxyInstance(ProxyExample.class.getClassLoader(), 
       new Class<?>[] {AnInterface.class}, 
       new InvocationHandler() { 
      @Override 
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
       return "proxy: " + method.invoke(obj); 
      } 
     }); 
    } 

    static interface AnInterface { 
     public String aMethod(); 
    } 

    static class AClass implements AnInterface { 
     @Override 
     public String aMethod() { 
      return "string"; 
     } 
    } 

} 
+0

ok thx! Programiści java są poza moimi możliwościami (choć jedynym "proxy", jakiego znam, jest użycie innego adresu IP, przez który przechodzą moje żądania sieciowe, aby ukryć własne IP.) Nie wiem, czy te dwa pojęcia są powiązane, ponieważ widziałem to słowo "proxy" używane w wielu różnych domenach, co jest mylące: /) – user3578836

+0

@ user3578836, Właśnie dodałem przykład proxy. Proxy w tym kontekście oznacza obiekt, który może pośredniczyć w wywołaniach metod do innego obiektu. –

6

AspectJ to, z braku lepszego słowa, "czysty" framework Aspekt. Kryteria polegają na tym, że może być szeroko stosowany w różnych okolicznościach. Dowolny aspekt, na dowolnej klasie, w dowolnym czasie.

To powiedziawszy, technika aspektu przechwytywania i pakowania wywołań metodowych, znalazła swój sposób wszechobecny w Javie. Jednak tendencja do specjalizacji ogólnej koncepcji aspektu do określonych celów.

Bardzo wczesny "aspekt" został dokonany dzięki wczesnym funkcjom EJB. Wymagało to użycia plików XML w celu rozszerzenia klas i interfejsów, tak aby kontener mógł tworzyć obiekty proxy, które zawijałyby inwokacje metod w kontekstach transakcji. To zawijanie metod jest pojęciem aspektowym, ale wczesna specyfikacja EJB oferowała jedynie zdolność do bardzo konkretnego zastosowania zarządzania transakcjami.

Pojawienie się adnotacji w Javie 1.5 otworzyło tę koncepcję augmentacji programowania zorientowanego na aspekt.Nie jest tak, że potrzebujesz adnotacji, aby to włączyć, ale po prostu sprawia, że ​​struktury są znacznie łatwiejsze w użyciu, ponieważ adnotacje eliminują zewnętrzną konfigurację meta-danych (używając, być może, plików XML).

Obecnie wiele systemów Java wykorzystuje koncepcje programowania zorientowanego na aspekt, zazwyczaj poprzez odbicie i adnotacje, w celu wdrożenia pewnych funkcji. Niezależnie od tego, czy jest to iniekcja typu, metody, sprawdzanie poprawności itp.

Kluczowym elementem tego wszystkiego jest pewien mechanizm przechwytywania wywołania metody. AspectJ pracował, zmieniając docelową klasę w locie, zamiast wtrącać środkowego mężczyznę. EJB działa poprzez tworzenie serwerów proxy na interfejsach (coś, co można zrobić po wyjęciu z pudełka w Javie), a następnie, gdy program prosi kontener o instancję, zapewnia serwer proxy z prawdziwą instancją.

Tak więc, aby włączyć "ogólne" AOP, wszędzie, przez cały czas, na pewno potrzebujesz czegoś szerokiego, jak AspectJ. Ale aby uzyskać wiele korzyści z tego, nie musisz posuwać się tak daleko. Prosta klasa Factory i interfejs mogą łatwo wykonać tę pracę.