android - Android 2.2 没有完全实现反射?

标签 android reflection

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

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

编辑

我在 android 文档上做了一些窥探,发现一些方法在 API 级别 9 之前不可用。但是,据说 getType()、getGenericType() 和 ParameterizedType 都在 API 级别 1 中受支持。那么为什么这段代码不起作用?

现场文档:http://developer.android.com/reference/java/lang/reflect/Field.html

参数化类型文档:http://developer.android.com/reference/java/lang/reflect/ParameterizedType.html

编辑

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

最佳答案

这是一个已知问题,这是 Android 错误跟踪器中的票证:Issue 6636: NPE in org.apache.harmony.luni.lang.reflect.ListOfTypes

它已在 Android 2.3 中修复,但尚未向后移植到早期的 Android 版本,这就是您在 Android 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.lang.NullPointerException
   at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47)
   at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83)
   at com.reproducebug.ReproduceBugActivity.onCreate(ReproduceBugActivity.java:23)

因为上面提到的 Java 反射实现中的错误。在 Android 2.3 上,该错误已得到修复,您将在 logcat 中看到:

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

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

关于android - Android 2.2 没有完全实现反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8041142/

相关文章:

c# - 如何使用 C# 反射将值设置为嵌套属性。?

.net - CLR token 可以为零或负数

android - 正确编辑 android list

android - ScaleAnimation Android Api 级别 8

iphone - Canvas 绘图线在 phonegap 中使用 android 非常慢

java - 如何在Java中实例化类,其中被测试类的构造函数中的参数数量通过反射未知?

android - 使用 Butterknife 注入(inject) View 数组

android - 错误 : --alias must be specified using PEPK tool

c++ - 如何获取指向函数第一个参数的指针?

java - 使用数组元素作为参数实例化对象java