反映在Android 2.2中没有完全实现?

oni*_*nit 2 reflection android

我有一些在2.3及以上版本中运行良好的代码.但是,在2.2中,当className被赋值时,我得到一个NullPointerException:

if(field.getType() == java.util.ArrayList.class)
   className = ((ParameterizedType)field.getGenericType()).toString();
Run Code Online (Sandbox Code Playgroud)

编辑

我在android文档上做了一些窥探,发现有些方法在API级别9之前不可用.但是,getType(),getGenericType()和ParameterizedType都被认为在API级别1得到支持.那么为什么呢这段代码有用吗?

字段文档:http://developer.android.com/reference/java/lang/reflect/Field.html

ParameterizedType文档:http://developer.android.com/reference/java/lang/reflect/ParameterizedType.html

编辑

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

Mar*_*lts 7

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

它已在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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

你会得到这个例外:

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)
Run Code Online (Sandbox Code Playgroud)

因为Java反射实现中存在上述错误.在Android 2.3上,该错误已得到修复,您将在logcat中看到:

I/ReproduceBugActivity(23449): className = java.util.ArrayList<java.lang.Object>
Run Code Online (Sandbox Code Playgroud)

com.sun.jdi.InvocationException据我所知,您所看到的例外情况与此无关.