0

我试图在抽象类中调用私有方法。我用了 :

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

SongTagEditorActivity扩展AbsTagEditorActivity

但是,如果我尝试将方法getAudioFile

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

有用

方法应该是这样的:

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

我究竟做错了什么 ?

提前致谢

4

2 回答 2

0

您不能通过 Xposed 挂钩抽象方法。如果要挂钩抽象方法,则需要挂钩扩展该抽象类的类中的方法。与接口相同的情况。您需要在实现该接口的类中挂钩方法。此外,如果您想调用私有方法,则需要将其设置为可通过反射访问。只是谷歌如何做到这一点。

于 2016-09-11T08:18:07.987 回答
0

快速浏览一下 Xposed Helpers,可能是因为您尝试调用该方法的对象是一个子类,而 XposedHelpers.callMethod 似乎不允许从超类调用私有方法

尝试在挂钩“getTrackNumber”时记录“this”对象类名称,您可以尝试使用反射自己调用它。

于 2016-09-06T14:13:13.553 回答