2016-09-02 10 views
0

私は抽象クラスの中でプライベートメソッドを呼び出そうとしました。私が使用:Xposedコールのプライベートメソッドが動作しない

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"); 
      } 
     }); 
方法 getAudioFilegetTrackNumberは、抽象クラス内で宣言されている

AbsTagEditorActivity

それはNoSuchMethodError:com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity#getAudioFile(java.lang.String)#bestmatchを返します。

クラスSongTagEditorActivityAbsTagEditorActivity

を拡張しかし、私は

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]); 
      } 
     }); 

と方法getAudioFileをフックしようとした場合、それは動作します

方法は、このようになります。

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

何私は間違っている? Xposedヘルパーで簡単に見から事前

答えて

0

Xposedを使用して抽象メソッドをフックすることはできません。抽象メソッドをフックするには、その抽象クラスを継承するクラスの中でメソッドをフックする必要があります。インターフェイスでも同じです。そのインタフェースを実装するクラスにメソッドをフックする必要があります。 また、プライベートメソッドを呼び出す場合は、リフレクションを介してアクセス可能にする必要があります。ちょうどそれを行う方法をGoogle。

0

おかげであなたは上のメソッドを呼び出すためにしようとしているオブジェクトはサブクラスであり、XposedHelpers.callMethodはinvoking private methods from superclassesを許可していないようですので、それはあるかもしれません。

「getTrackNumber」をフックするときに「この」オブジェクトクラス名をログに記録して、自分でリフレクションを使用して呼び出すことができます。

関連する問題