2014-01-27 91 views
0

案例1:看看下面的代碼。我能夠獲得類和方法對象,它運作良好。我試圖訪問的方法是android.view.View :: dispatchPointerEvent。Android反射 - Android罐子

案例2:當我用com.android.server.pm.PackageManagerService :: grantPermissionsLPw替換class/Method時,我得到NoM​​ethodFoundException。班雖然可以訪問。

案例3:當我用android.hardware.input.InputManager :: injectInputEvent替換class/Method時,我得到NoM​​ethodFoundException。班雖然可以訪問。

問題是:爲什麼一些android類/方法可以通過反射和其他一些不可用?

Class _class = null; 
    try { 
     _class = Class.forName("android.view.View"); 
     Log.i("Test", "Class found"); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    Method method = null; 
    try { 
     Log.i("Test", "Pre-Method found"); 

     method = _class.getDeclaredMethod("dispatchPointerEvent", 
       MotionEvent.class); 

     Log.i("Test", "Method found"); 

    } catch (Exception e) { 
     Log.i("Test","I failed."+e.getMessage()+e.toString()); 
     //e.printStackTrace(); 
    } 

回答

1

試試這個

Class _class = null; 
    try { 
     _class = Class.forName("com.android.server.pm.PackageManagerService"); 
     Log.i("Test", "Class found"); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    Method method = null; 
    try { 
     Log.i("Test", "Pre-Method found"); 
     Class _class2 = Class.forName("android.content.pm.PackageParser$Package"); 

     method = _class.getDeclaredMethod("grantPermissionsLPw", 
       _class2, boolean.class); 

     Log.i("Test", "Method found"); 

    } catch (Exception e) { 
     Log.i("Test","I failed."+e.getMessage()+e.toString()); 
     e.printStackTrace(); 
    } 
0

(對不起,但我不能發表評論,因此必須發佈響應) 你把正確的方法參數?你在哪裏有MotionEvent.class

+0

是的,我沒有更換參數合適,也可通過SetAccessible真正照顧了私有方法對其他做題所示.. – Jailbroken

+0

你內部的應用程序或仿真器執行或只調用一個IDE項目?如果你不在模擬器中,我想你是在調用一個存根,沒有什麼可做的。 –

+0

我直接在設備上執行.. – Jailbroken

0

android.hardware.input.InputManager :: injectInputEvent需要android.permission.INJECT_EVENTS權限,這是系統權限不可用於應用程序。如果您需要這樣做,則必須將設備根目錄並將其作爲系統應用程序簽名。

+0

但我不是這麼叫的。通過反思,我只是試圖訪問它。如果我調用並失敗,我可以理解。但NoMethodFoundException是非常令人困惑的。 – Jailbroken

+0

你應該發佈不工作的代碼。 –

+0

如果您只是從案例2或3中替換類和方法名稱,則不起作用。代碼保持不變。只有類和方法名稱發生更改,並引發NoMethodFoundException。不想重複相同的代碼,並使其理解複雜。 – Jailbroken