反射对 Android 有用吗?

Is reflection useful for Android?

在阅读这里的一些图片后,我对反射有了一些了解。据我了解,它用于在运行时检查某个 class/method/field 的可用性。但它在 Android 中真的有用吗? Android 在运行时为我们提供 api 版本,我们可以通过阅读 Android 文档(或带有 Android 工作室).

我理解它在 Java 中的一般用途,但是在 Android 中使用它有什么意义吗?

有时有效,有时无效。

E.T 工作示例: 你可以反映挂断phone电话的方法(网上有很多示例代码,我就不复制了)。

无效示例: 如果你想切换数据连接状态,使用反射在 4.4 上有效但在 5.0 上不起作用,因为它是活页夹连接,BN 将检查应用程序授予的权限,但此权限仅授予系统应用程序。所以如果你的应用是第三方应用,在 5.0 上你不能使用反射来切换数据连接状态。

希望对您有所帮助

反射(在所有语言中)非常强大。

在Android大部分时间反射是不需要的,因为你可以发现安全异常,问题。这取决于你做什么。

如果你使用未记录的 类, 库,你可以使用它,它非常有用。

有时,为了做一些特殊的事情,比如在旧设备上打开 on/off3g,更改设备语言,你需要 root 设备才能使用反射。

最后,总是取决于你做什么。

这是一个非常笼统的问题,它实际上取决于您要做什么。有时你必须使用反射,如果 API 是隐藏的,这一切都取决于你的用例,通常你应该避免反射,因为它会使你的代码变得比它需要的更复杂,并且它对于 android 的进一步版本可能不安全。

在我看来,这是做特定事情的好方法。 例如,您可以使用 PowerProfile class 的方法为您的 phone.

做一个简单的电源模型

通过方法 getAveragePower(POWER_WIFI_SCAN),您可以获取子系统消耗的平均电流(以 mA 为单位)(在这种情况下:扫描期间的 wi-fi)。

因此,要使用 PowerProfile 的方法获取电池容量,您可以使用 java 以这种方式进行反射:

private Object mPowerProfile_;
private static final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";
private Double batteryCapacity = Double.valueOf(1);

public Double getBatteryCapacity(Context ctx) {

    try {
mPowerProfile_ = Class.forName(POWER_PROFILE_CLASS).getConstructor(Context.class).newInstance(this);
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

try {
batteryCapacity = (Double) Class.forName(POWER_PROFILE_CLASS).getMethod("getAveragePower", String.class).invoke(mPowerProfile_, "battery.capacity");
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
}