2016-05-05 20 views
1

Es gibt eine interface IA Klasse in der APK-Datei. Ich erstelle ein Glas mit IA implementation MA. Das Glas hat eine Global class und B class. Das Jar wird dynamisch mit Dexclassloader aus dem Datenverzeichnis geladen.Warum java.lang.NoSuchMethodError, wenn ein Dex-Jar dynamisch geladen wird?

interface IA { 
    test(); 
} 

class Global { 
    IA instance; //refer to MA instance. 
} 

class B { 
    .... 
    instance.test() ; // throw NoSuchMethodError 
.... 
} 

Aber es ist in Ordnung, Instanz-Testmethode durch Reflexion aufzurufen.

Warum? Sicherlich kenne ich einige Prinzipien von Classloader oder DexClassloader nicht. Könnte jemand eine Erklärung für mich geben? Danke

+0

Sie haben die Methode nicht implementiert. Interface hat nur eine Erklärung der Methode. Und Sie verwenden übrigens keine Reflexion. – Batty

+0

@Batty Instance ist eine MA-Instanz, die die Schnittstelle IA in der apk-Klasse implementiert –

Antwort

0

Ich habe auch einen NoSuchMethod Fehler, nach einigen Tests fand ich heraus, dass das Problem war, dass die DEX-Datei in der JAR nicht Classes.dex hieß, wie es sein soll. Die Tatsache, dass die App eine neue Instanz Ihrer Klasse erstellen konnte, bedeutet nicht unbedingt, dass der DEX richtig geladen wurde, ich testete ihn mit einem leeren JAR (dh entfernte alle internen Dateien über 7-ZIP) und war immer noch in der Lage um meine Klasse zu instanziieren (obwohl ich denke, dass es nur mit einem Standardkonstruktor funktionieren würde, der null Parameter erhält).