案例1 :请看下面的代码。我能够获得Class和Method对象,并且效果很好。我试图访问的方法是android.view.View :: dispatchPointerEvent。
案例2 :当我用com.android.server.pm.PackageManagerService :: grantPermissionsLPw替换class / Method时,我得到NoMethodFoundException。虽然可以访问班级。
案例3 :当我用android.hardware.input.InputManager :: injectInputEvent替换class / Method时,我得到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();
}
答案 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用户并将您的应用程序签名为系统应用程序。