首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对出错的字段的反思

对出错的字段的反思
EN

Stack Overflow用户
提问于 2010-06-01 17:32:19
回答 7查看 2.9K关注 0票数 4

我一直在尝试为android.os.build类中的一个指定字段--制造商字段--使用反射。我试过使用下面的代码:

代码语言:javascript
复制
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());
    }

我收到以下错误:

代码语言:javascript
复制
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被不断抛出,所以我猜我没有正确地实现整个反射原理……你知道哪里出了问题吗?或者如何正确地实现单个字段的反射?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-09-24 18:21:50

完美的解决方案

代码语言:javascript
复制
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());
  }
票数 3
EN

Stack Overflow用户

发布于 2010-06-01 17:38:28

此字段为公共字段。你不需要反射来阅读它。

但是你的代码中有几个问题导致了这个错误:

代码语言:javascript
复制
Class myBuildClass = android.os.Build.class;
Field m1 = Build.class.getDeclaredField("MANUFACTURER");

你定义了myBuildClass,但后来你再也不用它了。字段m1也是如此。在此之后,您只需通过调用

代码语言:javascript
复制
Build.MANUFACTURER;

那么整个refleciton用的是什么呢?

如果它是私有的,你可以用下面的方法:

代码语言:javascript
复制
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版本中工作,但我不得不提一下,我认为这真的是不必要的,部分也是错误的。

票数 1
EN

Stack Overflow用户

发布于 2010-06-01 18:02:27

如果您查看API文档,您将看到Build.Manufacturer仅在API4级之后才可用。这意味着如果您在API版本3或更低版本的Android设备上运行代码,它将失败,因为该字段不存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2948606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档