JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
然而在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用,三方应用上我们就很方便的去用这些方法。
例如我们需要安全的杀死某个应用的服务和进程调用ActivityManager.forceStopPackage()方法很方便
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Method m =
null
;
try
{
Class c = Class.forName(
"android.app.ActivityManager"
);
m = c.getMethod(
"forceStopPackage"
, Class.forName(
"java.lang.String"
) );
m.invoke(am,
"com.tencent.mobileqq"
);
}
catch
(IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
|
当然隐藏了这些API是为了防止第三方应用打破其他应用程序,停止服务,消除他们的警报等等。隐藏的这些api肯定也是有系统权限的,这些权限也是被隐藏的,那么我们怎么在自己的应用里去调用这些权限呢?
1
2
3
4
5
6
7
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
package
=
"com.acer.shadow.apps"
android:versionCode
=
"1"
android:versionName
=
"1.0"
android:sharedUserId
=
"android.uid.system"
>
<
uses-permission
android:name
=
"android.permission.FORCE_STOP_PACKAGES"
/>
|