我一直在尝试为android.os.build类中的一个指定字段--制造商字段--使用反射。我试过使用下面的代码:
try
{
Class myBuildClass = android.os.Build.class;
Field m1 = Build.class.getDeclaredField("MANUFACTURER");
validField = true;
manufacturer = Build.MANUFACTURER;
}
catch(Exception ex)
{
manufacturer = Build.PRODUCT;
System.err.println("getDeviceSpecifics, got an exception during getting Field : " + ex.toString());
}我收到以下错误:
06-01 11:26:37.639: WARN/dalvikvm(7342): VFY: unable to resolve static field 2 (MANUFACTURER) in Landroid/os/Build;
06-01 11:26:37.639: WARN/dalvikvm(7342): VFY: rejecting opcode 0x62 at 0x0048
06-01 11:26:37.639: WARN/dalvikvm(7342): VFY: rejected Lmypackage/android/managementModule/Management;.getDeviceSpecifics ()V
06-01 11:26:37.639: WARN/dalvikvm(7342): Verifier rejected class Lmypackage/android/managementModule/Management;在调试时,我注意到InvocationtargetException被不断抛出,所以我猜我没有正确地实现整个反射原理……你知道哪里出了问题吗?或者如何正确地实现单个字段的反射?
发布于 2010-09-24 18:21:50
完美的解决方案
try // reflection
{
Field manufacturerField = android.os.Build.class
.getDeclaredField("MANUFACTURER");
manufacturerField.setAccessible(true);
String manufacturerName = manufacturerField.get(
android.os.Build.class).toString();
System.out.println("manufacturerName: " + manufacturerName);
} catch (Exception ex) {
System.err
.println("getManufacturerName, got an exception during getting Field : "
+ ex.toString());
}发布于 2010-06-01 17:38:28
此字段为公共字段。你不需要反射来阅读它。
但是你的代码中有几个问题导致了这个错误:
Class myBuildClass = android.os.Build.class;
Field m1 = Build.class.getDeclaredField("MANUFACTURER");你定义了myBuildClass,但后来你再也不用它了。字段m1也是如此。在此之后,您只需通过调用
Build.MANUFACTURER;那么整个refleciton用的是什么呢?
如果它是私有的,你可以用下面的方法:
Field manufacturer = android.os.Build.class.getDeclaredField("MANUFACTURER");
manufacturer.setAccessible(true);
int myManufacturer = manufacturer.getInt(android.os.Build.class);注意: manufacturer.getInt(android.os.Build.class)是可能的,因为它是一个静态字段。否则,您将需要传递此类的实际对象。
我在您的评论中看到,您希望检查该字段是否可用。该字段将始终可用,但它可能会不时具有不同的值。为什么它不能使用呢?
好了,现在我也在你的评论中看到,你想在1.6版本中这样做。查看documentation,您将看到此字段是在API1.4级别添加的。
你的代码可能会在1.6版本中工作,但我不得不提一下,我认为这真的是不必要的,部分也是错误的。
发布于 2010-06-01 18:02:27
如果您查看API文档,您将看到Build.Manufacturer仅在API4级之后才可用。这意味着如果您在API版本3或更低版本的Android设备上运行代码,它将失败,因为该字段不存在。
https://stackoverflow.com/questions/2948606
复制相似问题