58 votes

MethodHandle - De quoi s'agit-il?

Je suis étudient de nouvelles fonctionnalités de JDK 1.7 et j'ai juste ne peux pas obtenir ce que MehodHandle est conçu pour? Je comprends (direct) invocation de la méthode statique (et l'utilisation de Base de la Réflexion de l'API qui est simple dans ce cas). Je comprends aussi (direct) invocation de la méthode virtuelle (non statique, non-final), et l'utilisation de Base de Réflexion à une API qui nécessite de passer par la Classe de la hiérarchie obj.getClass().getSuperclass()). L'Invocation de la non-méthode virtuelle peuvent être traités comme des cas particuliers de l'ancien.

Oui, j'ai conscience qu'il y a un problème de surcharge. Si vous voulez appeler la méthode que vous avez à fournir l'exacte signature. Vous ne pouvez pas vérifier la méthode surchargée de manière simple.

Mais, qu'est-ce que MethodHandle sujet? La réflexion de l'API vous permet de "voir" l'objet internes, sans aucune pré-prise en charge (comme la mise en œuvre de l'interface). Vous pouvez inspecter l'objet pour un certain but. Mais qu'est-ce que MethodHandle est conçu de trop? Pourquoi et quand dois-je utiliser?

Mise à JOUR: je suis en train de lire ce http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html l'article. Selon elle, l'objectif principal est de simplifier la vie des langages de script qui s'exécute au sommet de la JVM, et pas pour le Langage Java lui-même.

Mise à JOUR 2: j'ai fini de lire le lien ci-dessus, quelques devis à partir de là:

La JVM va être le meilleur de la VM pour la construction dynamique des langues, car il est déjà un langage dynamique VM. Et InvokeDynamic, par la promotion de la dynamique des langues à la première classe de la JVM des citoyens, va le prouver.

En utilisant la réflexion d'invoquer des méthodes fonctionne très bien...sauf pour quelques problèmes. Méthode objets doivent être récupérées à partir d'un type spécifique, et ne peut pas être créé de manière générale.<...>

...reflète l'invocation est beaucoup plus lent que l'invocation directe. Au fil des ans, la JVM a obtenu très bien reflété l'invocation rapide. Moderne Jvm effectivement générer un tas de code en coulisses pour éviter une grande partie de la surcharge de vieilles machines virtuelles sous traitées. Mais la simple vérité est que reflète l'accès par le biais de n'importe quel nombre de couches toujours plus lent qu'un appel direct, en partie parce que le complètement generified "invoquer" la méthode doit vérifier et re-vérifier le type de récepteur, types d'arguments, de la visibilité, et d'autres détails, mais aussi parce que tous les arguments doivent être des objets (donc des primitives obtenir l'objet en boîte) et doit être fourni comme un tableau à couvrir toutes les arities (ainsi les arguments obtenir tableau encadré).

La différence de performance ne peut pas d'importance pour une bibliothèque à faire quelques reflète les appels, en particulier si ces appels sont pour la plupart à définir de façon dynamique en place une structure statique dans la mémoire à l'encontre de laquelle il peut faire un appel normal. Mais dans un langage dynamique, où chaque appel doit utiliser ces mécanismes, c'est une grave dégradation des performances.

http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html

Donc, pour le programmeur Java c'est essentiellement inutile. Suis-je le droit? De ce point de vue, Il peut être considéré que comme un moyen alternatif de Base de l'API Reflection.

35voto

Peter Lawrey Points 229686

Il est précurseur de Java 8 assurer la prise en charge linguistique pour MethodHandles. Vous serez en mesure de se référer à une méthode directement et MethodHandles soutiendra que.

Ce que vous pouvez faire avec MethodHandles est de curry, de méthodes, de changer les types de paramètres et de modifier leur ordre.

Méthode Poignées peuvent gérer à la fois les méthodes et les champs.

Un autre truc qui MethodHandles faire est d'utiliser des primitives direct (plutôt que par des wrappers)

MethodHandles peut être plus rapide que l'utilisation de la réflexion qu'il n'y a plus de soutien direct dans la JVM e.g ils peuvent être intégrées. Il utilise la nouvelle invokedynamic instruction.

12voto

kittylyst Points 2541

Considérez MethodHandle comme un moyen moderne, plus flexible et plus sûr de faire de la réflexion.

Il est actuellement aux premiers stades de son cycle de vie - mais au fil du temps, il peut être optimisé pour devenir un moût plus rapidement que la réflexion - au point qu'il peut devenir aussi rapide qu'un appel de méthode normal.

11voto

java.lang.reflect.Method est relativement lent et coûteux en termes de mémoire. Les descripteurs de méthode sont censés être un moyen "léger" de contourner des pointeurs vers des fonctions que la JVM a une chance d'optimiser. Depuis JDK8, les descripteurs de méthodes ne sont pas si bien optimisés, et les lambdas sont susceptibles d'être initialement implémentés en termes de classes (tout comme les classes internes).

0voto

Anjan Saha Points 27

Peut-il être comparé à un délégué en c #?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X