Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 2.2中没有完全实现反射?_Android_Reflection - Fatal编程技术网

Android 2.2中没有完全实现反射?

Android 2.2中没有完全实现反射?,android,reflection,Android,Reflection,我有一些代码在2.3及以上版本中运行良好。但是,在2.2中,当分配类名时,我得到一个NullPointerException: if(field.getType() == java.util.ArrayList.class) className = ((ParameterizedType)field.getGenericType()).toString(); 编辑 我对android文档进行了一些窥探,发现有些方法直到API级别9才可用。但是,据说getType()、getGeneric

我有一些代码在2.3及以上版本中运行良好。但是,在2.2中,当分配类名时,我得到一个NullPointerException:

if(field.getType() == java.util.ArrayList.class)
   className = ((ParameterizedType)field.getGenericType()).toString();
编辑

我对android文档进行了一些窥探,发现有些方法直到API级别9才可用。但是,据说getType()、getGenericType()和ParameterizedType都在API级别1上受支持。那么为什么这个代码不起作用呢

现场文件:

参数化类型文档:

编辑


我发现调用field.getGenericType()不会导致程序崩溃,但会以静默方式抛出com.sun.jdi.InvocationException。调用getGenericType()返回的类型似乎无效?同样,这适用于2.3及以上版本,但为什么会在2.2及以下版本中引发并捕获此异常?

这是一个已知问题,以下是Android bug tracker中的记录:

它在安卓2.3中得到了修复,但尚未被后传到早期的安卓版本,这就是为什么安卓2.2中会出现崩溃的原因

更详细地说:如果您在Android 2.2上运行此代码(您自己代码的扩展版本):

public class ReproduceBugActivity extends Activity {
  private static final String TAG = "ReproduceBugActivity";
  private ArrayList<Object> mArrayList;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
      String className = null;
      Field field = getClass().getDeclaredField("mArrayList");
      if (field.getType() == java.util.ArrayList.class)
        className = ((ParameterizedType)field.getGenericType()).toString();
      Log.i(TAG, "className = " + className);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
因为Java反射实现中存在上述缺陷。在Android 2.3上,该错误已经修复,您将在logcat中看到:

I/ReproduceBugActivity(23449): className = java.util.ArrayList<java.lang.Object>
I/reproductebugactivity(23449):className=java.util.ArrayList

据我所知,您看到的
com.sun.jdi.InvocationException
异常与此无关。

如果您告诉我们,哪个对象/调用导致NPE,对我们来说会更容易。@WarrenFaith在classname=…所在行,以及该行的哪个调用/对象?可以是
字段
为null,或者
getGenericType()
返回null,以便强制转换和
toString()
抛出NPE。请尽可能具体。@WarrenFaith我已经更新了这个问题。但字段从来都不是空的。请尝试将这一行放在代码中:Type Type=field.getGenericType();。当我在调试期间将鼠标悬停在它上面时,type中的rawType变量为null,但它似乎具有正确的rawType名称。但是,它说该方法调用了com.sun.jdi.InvocationException。我认为NPE来自对对象调用的toString()方法。另外,你链接到的错误有点模糊,我没有从中得到太多。我假设这在任何时候都不会被修复,但我仍然想知道为什么它不能被修复,或者是否没有解决办法。我尝试了你的建议,现在我明白了你对“com.sun.jdi.InvocationException”的意思。这正是Eclipse所说的“我无法对您悬停的对象调用toString(),因为我得到了一个NPE”。我链接到的bug报告主要是供参考的。为了解决这个bug,您可以尝试避免对使用反射的字段使用泛型,因为这样Type.toString()就不会崩溃。您还可以尝试避免使用Type.toString()。好东西。也许是我能得到的最好的答案。真的希望这样的bug更容易得到答案,或者至少在SDK文档中得到评论。
I/ReproduceBugActivity(23449): className = java.util.ArrayList<java.lang.Object>