我是Android编程的新手。我想通过反射调用BatteryService类中的方法。但是,以下代码在Android 5.0之上失败,包括最新的Android 6.0.1,尽管它在Android 4.3中取得了成功。我用Google搜索了好几天。但我找不到任何有用的答案。
try{
Class myclass = Class.forName("com.android.server.BatteryService");
} catch (ClassNotFoundException e) {
e.printStackTrace();
Log.d("xx", "ClassNotFound!");
}
我已检查过Android 4.3,5.0和6.0.1的来源,我确信BATService类在com.android.server中。 BTW,BatteryService的修饰符是公开的。
运行上述代码时,Android 5.0+会报告无法找到Class的异常。但该代码适用于Android 4.3。我想知道Android 5.0中是否有任何新功能可以防止反射?
任何人都知道原因。万分感谢!
答案 0 :(得分:0)
可能类加载器并不知道该类。 App类加载器和系统类加载器不相同。
EDITED
启动systemserver时,类路径已设置。 所以,系统应用程序可能没有这个类加载器。
/**
* Finish remaining work for the newly forked system server process.
*/
private static void handleSystemServerProcess(
ZygoteConnection.Arguments parsedArgs)
throws ZygoteInit.MethodAndArgsCaller {
....
ClassLoader cl = null;
if (systemServerClasspath != null) {
cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader());
Thread.currentThread().setContextClassLoader(cl);
}
/*
* Pass the remaining arguments to SystemServer.
*/
RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
答案 1 :(得分:0)
如前所述,类加载器无法找到该类。这是因为如果您没有系统权限,则包的范围是不可见的(您的apk应该安装在/ system / app中)。
我建议你阅读this doc
答案 2 :(得分:0)
您应该避免反思并使用服务类BatteryManager。
http://developer.android.com/reference/android/os/BatteryManager.html