web-dev-qa-db-fra.com

Qu'est-ce que Invokedynamic et comment l'utiliser?

J'entends sans cesse parler de toutes les nouvelles fonctionnalités intéressantes qui sont ajoutées à la machine virtuelle Java et l'une de ces fonctionnalités intéressantes est appelée Invokedynamic. Je voudrais savoir ce que c'est et comment cela facilite la programmation réflexive dans Java plus facile ou meilleur?

150
davidk01

Il s'agit d'une nouvelle instruction JVM qui permet au compilateur de générer du code qui appelle des méthodes avec une spécification plus souple que par le passé - si vous savez ce que " typo de canard " est, invokedynamic permet fondamentalement le typage de canard. Vous ne pouvez pas trop en faire en tant que programmeur Java; si vous êtes un créateur d’outils, vous pouvez l’utiliser pour créer des langages basés sur JVM plus souples et plus efficaces. - Ici est un article de blog vraiment sympa qui donne beaucoup de détails.

157

Il y a quelque temps, C # a ajouté une fonctionnalité intéressante, la syntaxe dynamique dans C #.

Object obj = ...; // no static type available 
dynamic duck = obj;
duck.quack(); // or any method. no compiler checking.

Considérez-le comme un sucre de syntaxe pour les appels de méthodes réflexives. Il peut avoir des applications très intéressantes. voir http://www.infoq.com/presentations/Statically-Dynamic-Typing-Neal-Gafter

Neal Gafter, responsable du type dynamique de C #, vient de passer de Sun à MS. Il n'est donc pas déraisonnable de penser que les mêmes choses ont été discutées à l'intérieur de Sun.

Je me souviens que peu de temps après, un mec Java avait annoncé quelque chose de similaire

InvokeDynamic duck = obj;
duck.quack(); 

Malheureusement, la fonctionnalité n’est nulle part ailleurs Java 7. Très déçu. Pour les programmeurs Java, ils n’ont pas de moyen facile de tirer parti de invokedynamic dans leurs programmes.

8
irreputable

Il y a deux concepts à comprendre avant de continuer à invokedynamic.

1. Statique vs. Dynamin Typing

Statique - Vérification du type des préformes au moment de la compilation (par exemple, Java)

Dynamique - vérification du type de préformes au moment de l'exécution (par exemple, JavaScript)

La vérification de type est un processus qui permet de vérifier qu'un programme est sécurisé, c'est-à-dire de vérifier les informations typées des variables de classe et d'instance, des paramètres de méthode, des valeurs de retour et d'autres variables. Par exemple. Java connaît Int, String, .. au moment de la compilation, alors que le type d'un objet en JavaScript ne peut être déterminé qu'au moment de l'exécution.

2. Typage fort ou faible

Strong - spécifie des restrictions sur les types de valeurs fournies à ses opérations (par exemple, Java)

Faible - convertit (convertit) les arguments d'une opération si ces arguments ont des types incompatibles (par exemple, Visual Basic)

Sachant que Java est un type typé statiquement et faiblement, comment implémentez-vous des langages dynamiquement et fortement typés sur la JVM?

L'invokedynamic implémente un système d'exécution qui peut choisir l'implémentation la plus appropriée d'une méthode ou d'une fonction - après la compilation du programme.

Exemple: Ayant (a + b) et ne sachant rien des variables a, b au moment de la compilation, invokedynamic mappe cette opération sur la méthode la plus appropriée dans Java à Par exemple, s'il s'avère que a, b sont des chaînes, alors appelez la méthode (String a, String b). S'il s'avère que a, b sont ints, alors appelez la méthode (int a, int b).

invokedynamic a été introduit avec Java 7.

4
Sabina Orazem