2016-09-02 6 views
0

Ich habe versucht, eine private Methode innerhalb einer abstrakten Klasse aufzurufen. Früher habe ich:Xposed Anruf private Methode funktioniert nicht

XposedHelpers.findAndHookMethod("com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity", lpparam.classLoader, "getTrackNumber",String.class, new XC_MethodHook(){ 
      @Override 
      protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { 
       Object obj1= XposedHelpers.callMethod(param.thisObject,"getAudioFile","test"); 
      } 
     }); 

, wo die Methoden getAudioFile und getTrackNumber innerhalb der abstrakten Klasse deklariert sind AbsTagEditorActivity

Es NoSuchMethodError:com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity#getAudioFile(java.lang.String)#bestmatch zurückzukehren.

Die Klasse SongTagEditorActivity erstreckt AbsTagEditorActivity

Aber wenn ich versuche, das Verfahren zu einzuhaken getAudioFile mit

XposedHelpers.findAndHookMethod("com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity", lpparam.classLoader, "getAudioFile",String.class, new XC_MethodHook() 
     { 
      @Override 
      protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable 
      { 
       XposedBridge.log("test:"+param.args[0]); 
      } 
     }); 

funktioniert es

Das Verfahren sollte sein:

@NonNull 
    private AudioFile getAudioFile(@NonNull String paramString) 
    { 
     try 
     { 
      AudioFile localAudioFile = AudioFileIO.read(new File(paramString)); 
      return localAudioFile; 
     } catch (Exception localException){} 
     return new AudioFile(); 
    } 

was mache ich falsch?

Vielen Dank im Voraus

Antwort

0

Sie können eine abstrakte Methode nicht über Xposed haken. Wenn Sie eine abstrakte Methode haken möchten, müssen Sie die Methode in der Klasse haken, die diese abstrakte Klasse erweitert. Gleicher Fall mit Schnittstellen. Sie müssen die Methode in der Klasse haken, die diese Schnittstelle implementiert. Auch wenn Sie eine private Methode aufrufen möchten, müssen Sie sie über Reflektion zugänglich machen. Einfach googeln, wie es geht.

0

Von einem kurzen Blick auf Xposed Helfer, könnte es sein, weil das Objekt, das Sie die Methode aufzurufen versuchen, auf eine Unterklasse ist und XposedHelpers.callMethod scheint nicht invoking private methods from superclasses zu ermöglichen.

Versuchen Sie, den Objektklassennamen "this" zu protokollieren, wenn Sie "getTrackNumber" haken, und Sie können versuchen, ihn selbst mithilfe der Reflektion aufzurufen.

Verwandte Themen