2009-02-18 11 views
8

Robię an application server i potrzebuję w tym celu manipulowania kodami bajtowymi (np. Wstawianie niestandardowych metod equals i hashCode do klas opisywanych przy pomocy @Entity). Teraz przekazuję JVM agenta Java (opcja -javaagent), który przetwarza kod bajtowy za pomocą ASM.Czy możliwe jest manipulowanie kodami bajtowymi podczas korzystania z OSGi?

Zastanawiam się przy użyciu OSGi, ale nie wiem, czy pozwala mi na niezbędne manipulowanie kodami bajtowymi.

  1. Czy można manipulować kodami bajtowymi podczas korzystania z OSGi? W jaki sposób?
  2. Czy jest możliwe, aby pakunek sam się deklarował, że wymaga manipulowania kodami bajtowymi, aby działał? Na przykład serwer aplikacji wymaga manipulowania niektórymi własnymi klasami podstawowymi.
  3. Czy można określić, że inny pakiet wymaga jakiejś manipulacji kodu bajtowego, bez znajomości tego pakietu? Na przykład wszystkie aplikacje uruchamiane na serwerze muszą być zmanipulowane, ale aplikacje nie muszą o tym wiedzieć.
  4. Czy możliwe jest zadeklarowanie się pakietu, że wszystkie pakiety, które od niego zależą, muszą być manipulowane kodami bajtowymi? Ułatwiłoby mi to stwierdzenie, że wszyscy, którzy polegają na pakiecie API, który zawiera adnotację @Entity, muszą zostać zmanipulowani.

Odpowiedz

3

1) Tak, możliwe jest manipulowanie kodami bajtowymi w OSGi. W jaki sposób jest nieco inny niż w standardowej java, musisz użyć wzorca rozszerzającego opisać tutaj http://www.osgi.org/blog/2007/02/osgi-extender-model.html. Wierzę, że Eclipse używa tego w swoim aspekcie aspektu równonocy: http://www.eclipse.org/equinox/incubator/aspects/. Spring DM zdecydowanie używa tego wzoru do autokonfigurowania modułu osgi dm.

2) który byłby zgodny z używanym układem wzmacniacza. w jaki sposób działa przedłużacz sprężynowy, szukając plików konfiguracyjnych w folderze META-INF/spring pakietu, zanim zostaną uruchomione przez platformę.

3) Ponownie, będzie to zależne od zdefiniowanego przez użytkownika przedłużacza.

4) Wierzę, że byłoby to możliwe, ponieważ zanim pakiet może zostać uruchomiony, musi zostać rozwiązany, a zależności uruchomione, twój wzmacniacz może następnie przeanalizować zależności pakietu i rozpocząć manipulację kodami bajtowymi.

+0

Wzmacniacz na OSGi ma bardzo niewiele wspólnego z manipulowaniem kodami bajtowymi. Aspekty równonocy używają specyficznego dla równonocy sposobu instalowania haka do machania. Jak wspomniano poniżej, od 4.3 istnieje standardowy sposób robienia tego. – aav

+0

aav, Rozumiem, że wzorzec extender ma niewiele wspólnego z manipulacją kodu bajtowego, co mam na myśli to dobry czas w cyklu życia osgi do wstrzyknięcia mechanizmu manipulacji kodu bajtowego. Pamiętaj też, że napisałem tę odpowiedź, zanim ogłoszono OSGi 4.3! Jest całkiem jasne, że ponieważ rzeczywisty interfejs API jest obsługiwany w OSGi 4.3, to, co powinno być używane. Odwołanie się do "Poniżej" jest mylące, ponieważ kolejność odpowiedzi może się zmienić w czasie (a poprawna odpowiedź jest teraz powyżej) –

6

OSGI 4.3 dodał WeavingHook, który pozwala na manipulację kodami bajtowymi za pomocą manipulatora kodu bajtowego do wyboru. Używam go z JavaAssist w jednym z moich projektów i działa świetnie.

Powiązane problemy