2012-06-13 19 views
7

Zastanawiam się, czy nowa instrukcja JavaTM invokedynamic bytecode może być użyta do implementacji multiple dispatch dla języka Java. Czy nowy interfejs API pod java.lang.invoke byłby przydatny do wykonywania takich zadań?Użyj invokedynamic do wdrożenia wielu wysyłek

Scenariusz, o którym myślałem, wyglądał następująco. (To wygląda na razie aplikacja do projektowania odwiedzający, ale nie mogą być przyczyny, że to nie jest realną opcją.)

class A {} 
class A1 extends A {} 
class A2 extends A {} 

class SomeHandler { 
    private void doHandle(A1 a1) { ... } 
    private void doHandle(A2 a2) { ... } 
    private void doHandle(A a) { ... } 

    public void handle(A a) { 
     MultipleDispatch.call(this, "doHandle", a); 
    } 
} 

Klasa biblioteka MultipleDispatch by następnie zrobić coś w rodzaju:

class MultipleDispatch { 

    public static Object call(Object receiver, String method, Object...arg) { 
     // something like that in byte code 
     #invokeDynamic "doHandle" "someBootstrap" 
    } 

    static CallSite someBootstrap { 
     // resolve that dynamic method call. 
    } 
} 

(jestem świadomy MultiJava, ale można to osiągnąć w Java czystej mody?)

+0

Warto może patrząc na MethodHandles w Java 7, ponieważ mogą one korzystać z dynamicznych wysyłki. –

+0

Ładne pytanie (+1). Czy w twoim pierwszym zdaniu brakuje słowa (świeżo dodane co, CallSite?)? – DaveFar

+0

Dziwne, że to pytanie tak mało uwagi :( – DaveFar

Odpowiedz

2

Ponieważ mam żadnego doświadczenia z invokedynamic, nie wiem jak dobra wydajność i typu bezpieczeństwo byłoby, ale może dać tylko kilka wskazówek:

1

Dyspozycja invokedynamic jest czysto instrukcja JVM, to nie odnosi się do dynamicznego wysyłki. Wysyłkę uzupełniają uchwyty metod (wykres obsługi metody i drzewo obsługi metody są również w porządku.), Która zawiera wiele instancji uchwytów metod. Ścieżka na wykresie (drzewo) reprezentuje jedną ścieżkę wysyłki.

Dla danej próbki, mógłbym utworzyć wykres (Różne osoby mogą mieć inny wynik wykresu). Na tym wykresie przechodzenie uchwytów metod na wykresie jest sposobem zakończenia działania polecenia disptach.

sample method handle tree