Android反射ClassNotFound

时间:2016-01-04 13:51:04

标签: android reflection classnotfound

我是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中是否有任何新功能可以防止反射?

任何人都知道原因。万分感谢!

3 个答案:

答案 0 :(得分:0)

可能类加载器并不知道该类。 App类加载器和系统类加载器不相同。

EDITED

启动systemserver时,类路径已设置。 所以,系统应用程序可能没有这个类加载器。

https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/com/android/internal/os/ZygoteInit.java#461

    /**
     * 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