如何在Activity中使用WindowManager对象的mGlobal成员并解决编译报错
问题原因
mGlobal是WindowManagerImpl类的私有非公开成员,不属于Android官方公开API。编译项目时使用的SDKandroid.jar包会移除所有隐藏API、私有成员的符号定义,所以编译阶段会直接报cannot resolve symbol mGlobal错误。- 调试器的表达式求值是运行时直接从内存读取对象结构,不需要依赖编译期的符号定义,所以可以正常获取到值。
解决方法
通过Java反射在运行时获取该成员的值,示例代码如下:
try { // 先获取WindowManager的实际实现类WindowManagerImpl Class<?> wmImplClazz = Class.forName("android.view.WindowManagerImpl"); // 获取mGlobal字段 Field mGlobalField = wmImplClazz.getDeclaredField("mGlobal"); // 允许访问私有字段 mGlobalField.setAccessible(true); // 从winMan实例中获取字段值 Object windowManagerGlobal = mGlobalField.get(winMan); Log.d("MainActivity", "WinMan : " + windowManagerGlobal); } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); }
注意事项
- 非公开API在不同Android版本中可能被修改、删除,没有兼容性保证,使用后需要做好各版本的适配和异常捕获。
- 从Android 9开始,系统对非公开API的访问做了限制,部分隐藏API反射调用也会被拦截,需要提前做好适配。
内容的提问来源于stack exchange,提问作者Gagan Bindoria
相关产品推荐
相关产品推荐

