SORU
1 EKİM 2009, PERŞEMBE


İnvokeinterface anlamı nedir?

JVM yöntemleri çağırır hakkında this article okuyorum ve çoğunu anladım sanırım. Ancak, hala sorun invokeinterface ihtiyacını anlamakta güçlük çekiyorum.

Bu şekilde anlıyorum, bir sınıf yöntemleri temelde sanal bir masa ve iki invokevirtual invokeinterface bir yöntem çağrılırken bu sanal tablo sorulduğunda.

Fark, o zaman, bir network üzerinde tanımlanan bir metod ve Yöntem, temel sınıf üzerinde tanımlı arasındaki nedir? Neden farklı bytecodes?

description of the instructions de çok benzer görünüyor.

Bu makalede, bir arabirim yöntemi tablo "farklı uzaklıklar" her zaman bir yöntem olarak adlandırılır. sahip olduğunu iddia ediyor Benim anlamadığım bir arayüz hiçbir nesnenin gerçek türü arabirimi olabilir, çünkü yöntem bir tablo var, neden.

Neyi kaçırıyorum?

CEVAP
1 EKİM 2009, PERŞEMBE


Her bir Java sınıfı ile ilişkilidirsanal bir yöntem tablo"bir sınıfın her yöntemi bayt kodu. bağlantılar içerir Bu tablo, belirli bir sınıfın üst sınıftan miras ve hatta bir kaç yeni yöntemleri bakımından genişletilir. 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() { }
}

tablolardaki sonuçlar

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

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

Not NextClass sanal yöntem tablo BaseClass tablo girişlerin sırası nasıl korur ve sadece yazar, "link" geçersiz kılan method2().

Bir uygulama JVM böylece optimize çağrısı invokevirtual hatırlamak BaseClass/method3() daima yanında olacağım üçüncü girişi sanal bir yöntem tablonun herhangi bir nesne bu yöntemi asla çağrılabilir.

invokeinterface ile bu optimizasyon mümkün değildir. 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() { }
}

Bu sınıf, hiyerarşi sanal bir yöntem tablolardaki sonuçlar

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

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

, AnotherClass beşinci giriş arabirim yöntemi içerir ve MyClass ikinci giriş içerir. Aslında doğru girişi bulmak için bu sanal bir yöntem masa, bir telefon için bir yöntem ile invokeinterface Her zaman için arama tamamlamak tabloda olmayan bir şans için stil optimizasyonu invokevirtual yapar.

invokeinterface birlikte aslında arabirimini uygulayan nesne referansları ile kullanılabilir olması gibi ek farklar vardır. Bu nedenle, invokeinterface bir yöntem tabloda var olup olmadığını zamanı kontrol edecek ve olası bir durum. Eğer daha derin bir konuya dalmak isterseniz, örneğin, "Efficient Implementation of Java Interfaces: Invokeinterface Considered Harmless" öneririm.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
Jvm

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • finalcall07

    finalcall07

    11 NİSAN 2008
  • magnum33563

    magnum33563

    8 NİSAN 2011