70 votes

Quel est le point d'invokeinterface?

Je suis en train de lire cet article sur la façon de la JVM invoque les méthodes, et je crois que j'ai plus de il. Cependant, j'ai encore de la difficulté à comprendre la nécessité d' invokeinterface.

La façon dont je le comprends, une classe a en fait une table virtuelle de méthodes et lors de l'appel d'une méthode avec soit invokevirtual ou invokeinterface cette table virtuelle est consulté.

Quelle est la différence, alors, entre une méthode définie sur une interface et une méthode définie sur une base de classe? Pourquoi les différents bytecode?

La description de la notice d'instructions de l'air également très similaire.

L'article semble affirmer que la méthode de la table d'une interface peut avoir "des positions différentes" chaque fois qu'une méthode est appelée. Ce que je ne comprends pas, c'est pourquoi une interface aurait une table de méthode, car aucun objet ne peut avoir l'interface que son type réel.

Ce qui me manque?

96voto

janko Points 2642

Chaque classe Java est associé à une méthode virtuelle de la table qui contient des "liens" vers le pseudo-code de chaque méthode d'une classe. Cette table est héritée de la super-classe d'une classe particulière et étendus en ce qui concerne les nouvelles méthodes d'une sous-classe. E. g.,

class BaseClass {
    public void method1() { }
    public void method2() { }
    public void method3() { }
}

class NextClass extends BaseClass {
    public void method2() { } // overridden from BaseClass
    public void method4() { }
}

résultats dans les tableaux

BaseClass
1. BaseClass/method1()
2. BaseClass/method2()
3. BaseClass/method3()

NextClass
1. BaseClass/method1()
2. NextClass/method2()
3. BaseClass/method3()
4. NextClass/method4()

Remarque, comment la méthode virtuelle de la table d' NextClass conserve l'ordre des entrées de la table de BaseClass et juste remplace le "lien" de method2() qui il remplace.

Une implémentation de la JVM peut ainsi optimiser un appel à l' invokevirtual en se souvenant que BaseClass/method3() sera toujours la troisième entrée dans la table de méthode virtuelle de n'importe quel objet cette méthode ne jamais être invoqué.

Avec invokeinterface cette optimisation n'est pas possible. E. g.,

interface MyInterface {
    void ifaceMethod();
}

class AnotherClass extends NextClass implements MyInterface {
    public void method4() { } // overridden from NextClass
    public void ifaceMethod() { }
}

class MyClass implements MyInterface {
    public void method5() { }
    public void ifaceMethod() { }
}

Cette hiérarchie de classe les résultats de la méthode virtuelle tables

AnotherClass
1. BaseClass/method1()
2. NextClass/method2()
3. BaseClass/method3()
4. AnotherClass/method4()
5. MyInterface/ifaceMethod()

MyClass
1. Maclasse/method5()
2. MyInterface/ifaceMethod()

Comme vous pouvez le voir, AnotherClass contient l'interface de la méthode dans sa cinquième entrée et MyClass il contient en sa deuxième entrée. Pour réellement trouver la bonne entrée dans la table de méthode virtuelle, un appel à une méthode invokeinterface auront toujours à la recherche de la table complète sans une chance pour le style de l'optimisation de la invokevirtual n'.

Il existe d'autres différences comme le fait, que invokeinterface peut être utilisé avec des références à des objets qui ne sont pas réellement implémenter l'interface. Par conséquent, invokeinterface devra vérifier lors de l'exécution si une méthode existe dans la table, et éventuellement de lever une exception. Si vous voulez plonger plus profondément dans le sujet, je vous suggère, par exemple, "la mise en Œuvre Efficace des Interfaces Java: Invokeinterface Considérés comme Inoffensifs".

2voto

ATorras Points 2082

En comparant les deux instructions de la spécification JVM , la toute première différence est que invokevirtual vérifie l'accessibilité de la méthode pendant la recherche, alors que invokeinterface ne le fait pas.

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