Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android反射-Android Jars_Android_Reflection - Fatal编程技术网

Android反射-Android Jars

Android反射-Android Jars,android,reflection,Android,Reflection,案例1:查看下面的代码。我能够获得类和方法对象,并且工作得很好。我试图访问的方法是android.view.view::dispatchPointerEvent 案例2:当我用com.android.server.pm.PackageManagerService::grantPermissionsLPw替换类/方法时,我得到了NoMethodFoundException。不过,课程是可以访问的 案例3:当我用android.hardware.input.InputManager::injectI

案例1:查看下面的代码。我能够获得类和方法对象,并且工作得很好。我试图访问的方法是android.view.view::dispatchPointerEvent

案例2:当我用com.android.server.pm.PackageManagerService::grantPermissionsLPw替换类/方法时,我得到了NoMethodFoundException。不过,课程是可以访问的

案例3:当我用android.hardware.input.InputManager::injectInputEvent替换类/方法时,我得到了NoMethodFoundException。不过,课程是可以访问的

问题是:为什么有些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();
    }
(抱歉,我无法发表评论,因此必须发表回复)
您是否设置了正确的方法参数?如果您拥有android.hardware.input.InputManager::injectInputEvent,则需要android.permission.Injection\u EVENTS权限,这是应用程序不可用的系统权限。如果您需要这样做,您必须根设备并将您的应用程序作为系统应用程序进行签名。

试试这个

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

是的,我确实适当地替换了参数,还通过SetAccessible true处理了私有方法,如其他SO问题所示..您是在应用程序或模拟器内执行还是仅仅从IDE项目调用?如果你不在模拟器中,我想你调用的是存根,没有什么可做的。我唯一能说的是“你运行的是什么android版本?”如果我没记错的话,api 10中会出现com.android.server.pm.PackageManagerService类。请检查你的版本。我已经超过10岁了。。我用的是16,但我不叫它。通过反思,我只是想接近它。如果我确实调用了,但失败了,我可以理解。但是NoMethodFoundException是非常令人困惑的。如果您只是替换案例2或案例3中的类和方法名称,它就不起作用。代码保持不变。只有类和方法名称更改,它抛出NoMethodFoundException。我不想重复同样的代码,让理解变得复杂。如果你真的只是替换类和方法的名称,那么很明显你没有为新方法传递正确的参数。这就解释了命名法的例外。