2009-08-12 10 views
5

Zakładając Mam klasy jakJak stworzyć interfejs przy starcie

public class FooImpl 
{ 
    public void bar(){}; 
} 

Czy istnieje sposób, aby stworzyć swój interfejs w czasie wykonywania?

np.

public interface Foo 
{ 
    public void bar(); 
} 

czekałem na Javasssist i prawdą jest, że to odbicie, że jestem zainteresowany w użyciu interfejs (jak Esko Luontola i Yishai stwierdził)

Więc chcę interfejs, który określa podzbiór oryginalnych metod klasowych, z których można utworzyć proxy.

zdałem sobie sprawę, że jest więcej rzeczy, które mają być zaniepokojeni jak

  • Jeśli ponowne wykorzystanie tego interfejsu lub utwórz nowy za każdym razem?
  • Klasa proxy jest w rzeczywistości nową instancją typu java.lang.reflect.Proxy, która może powodować konsekwencje w zależności od przypadku użycia.

Ostatnia kwestia sprawiła, że ​​zastanawiałem się, w jaki sposób niektóre ramy radzą sobie z tym, czy głęboko kopiują obiekt? czy enkapsulują proxy wewnątrz oryginalnej instancji?

Więc może po prostu łatwiej (choć może nie tak elegancko) wymagać, aby kod klienta tworzył interfejs dla klasy.

+7

Dlaczego chcesz to zrobić? –

+2

Tak, robienie interfejsu w czasie wykonywania programu powoduje, że cel interfejsu jest niekompletny. –

+0

@SteveB. Co jeśli, na przykład, chciałbym zawinąć pojo i mieć opakowanie wyrażające ten sam interfejs co pojo (który nie ma interfejsu podczas kompilacji)? –

Odpowiedz

2

Możesz to zrobić z manipulacją/generowaniem kodu bajtowego podczas ładowania klasy, na przykład używając ASM, Javassist lub podobnego, może również AspectJ.

Ważne pytanie brzmi: dlaczego miałbyś to zrobić? Żaden normalny kod nie może korzystać z klasy za pośrednictwem interfejsu, ponieważ interfejs nie istnieje w czasie kompilacji. Będziesz albo musiał wygenerować kod, który używa interfejsu, albo użyć refleksji - ale w takim przypadku równie dobrze możesz użyć oryginalnej klasy. Aby interfejs był przydatny, prawdopodobnie powinieneś także zmodyfikować oryginalną klasę tak, aby implementowała wygenerowany interfejs (można to zrobić za pomocą bibliotek, o których wspomniałem).

+0

+1 dla drugiego akapitu. –

1

Możesz wyświetlić coś takiego, jak Javassist, aby utworzyć klasę. Przeszedłbyś klasę za pomocą klasy Class.getMethods() i musisz zaimplementować kod bajtowy w czasie wykonywania interfejsu, a następnie użyć klasy Proxy, aby połączyć interfejs i implementację.

Powiązane problemy