反射对 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();
}
}
在阅读这里的一些图片后,我对反射有了一些了解。据我了解,它用于在运行时检查某个 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();
}
}