Android反射 - Android Jars

时间:2014-01-27 16:44:39

标签: android reflection

案例1 :请看下面的代码。我能够获得Class和Method对象,并且效果很好。我试图访问的方法是android.view.View :: dispatchPointerEvent。

案例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();
    }

3 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分:0)

(抱歉,我无法发表评论,所以必须发表回复) 你有没有把正确的方法参数?你有 MotionEvent.class

的地方

答案 2 :(得分:0)

android.hardware.input.InputManager :: injectInputEvent需要android.permission.INJECT_EVENTS权限,这是应用程序无法使用的系统权限。如果您需要这样做,您必须将设备作为root用户并将您的应用程序签名为系统应用程序。