java - Use invookedynamic para implementar envíos múltiples
method-overloading dispatch (2)
Me pregunté si la nueva instrucción invokedynamic
bytecode de invokedynamic
podría utilizarse para implementar despacho múltiple para el lenguaje Java. ¿La nueva API en java.lang.invoke sería útil para realizar tal cosa?
El escenario en el que estaba pensando se veía de la siguiente manera. (Esto se ve como un caso de solicitud para el patrón de diseño del visitante, pero puede haber razones por las que esta no es una opción viable).
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);
}
}
La clase de biblioteca MultipleDispatch
haría algo así:
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.
}
}
(Estoy al tanto de MultiJava , pero ¿se puede lograr esto de forma puramente Java?)
Como no tengo experiencia con invoinedynamic, no sé qué tan bueno sería el rendimiento y la seguridad de tipo, pero solo puedo dar algunos consejos :
- Da Vinci Machine Project ofrece despacho múltiple a través de invookedynamic (ver Multiple Dispatch / src / invookedynamicmultipledispatch /);
- Charles Oliver Natter ha hablado sobre las aplicaciones de invokedynamic en JAX2012 . Las diapositivas no entran en detalles en absoluto, pero creo que encontré más detalles en un video o podcast hablando de JAX2012, que no puedo encontrar en este momento.
- El despacho múltiple JVM de Christopher Dutchyn es un enfoque alternativo sin invocación dinámica. Su documento COOTS ''01 y estas diapositivas tienen una gran cantidad de información de rendimiento / evaluación comparativa (y son una buena lectura después de que haya terminado su disección;)
La instrucción invocada dinámica es puramente una instrucción JVM, no se relaciona con el despacho dinámico. El envío se completa con identificadores de método (el método maneja el gráfico y el método handle tree también son correctos.) Que comprende varias instancias de control de método. Una ruta en el gráfico (árbol) representa una ruta de envío.
Para su muestra dada, sería posible construir un gráfico (Diferentes personas pueden tener un resultado gráfico diferente). En este gráfico, el recorrido de los manejadores de método en el gráfico es la forma en que termina el preparado.