android5.1后新增shadow$_monitor_和shadow$_klass_ ,导致反射无效
2016-02-16 14:24
411 查看
转自:http://blog.csdn.net/huyuchaoheaven/article/details/48708281
简单来说就是Android sdk21以后 也就是Android5.0系统,google在Object中加入了2个字段
这样在反射的时候就会多出来一个int类型和class类型的字段,
当给int类型字段赋值的时候,导致错误!!!!
简单来说就是Android sdk21以后 也就是Android5.0系统,google在Object中加入了2个字段
private transient Class<?> shadow$_klass_; private transient int shadow$_monitor_;
这样在反射的时候就会多出来一个int类型和class类型的字段,
当给int类型字段赋值的时候,导致错误!!!!
/** * Android SDK21 在Object中增加了2个变量,这样在反射的时候就会多出来一个int类型和class类型的字段, * 导致错误。 * private transient Class<?> shadow$_klass_; * private transient int shadow$_monitor_; */ /********************************************* * 从,查询游标中取出查询数据 * * @param classz * @param cursor * @return List<Object> */ private List<Object> rawQuery(Class classz, Cursor cursor) { List<Object> resultObj = new ArrayList<Object>(); // 获取对象的字段 Field[] fields = getField(classz); // 判断是否存在查询的字段 if (fields.length == 0) return null; String fieldName = null; String fieldType = null; Object objName = null; int fieldIndex = 0; int i = 0; int max = fields.length; // 循环取出查询到的结果 while (cursor.moveToNext()) { LogUtil.e(this, "max fields = "+ max); // 构造新的实例对象 try { objName = classz.newInstance(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (InstantiationException e1) { e1.printStackTrace(); } // fields = objName.getClass().getFields(); try { for (i = 0; i < max; i++) { fields[i].setAccessible(true); fieldName = fields[i].getName(); fieldIndex = cursor.getColumnIndex(fieldName); fieldType = fields[i].getType().getSimpleName(); LogUtil.e(this, " objName = "+ objName+"fieldType = "+ fieldType + " fieldIndex = "+ fieldIndex + " fieldName = "+ fieldName); if ("byte".equals(fieldType)) fields[i].setByte(objName, (byte) cursor.getInt(fieldIndex)); else if ("String".equals(fieldType)) fields[i].set(objName, cursor.getString(fieldIndex)); else if ("int".equals(fieldType)) // android 5.0 之后会有错误。 if(!fieldName.equals("shadow$_monitor_")){ fields[i].setInt(objName, cursor.getInt(fieldIndex)); } else if ("boolean".equals(fieldType)) { if ("true".equals(cursor.getString(fieldIndex))) fields[i].setBoolean(objName, true); else fields[i].setBoolean(objName, false); } else if ("long".equals(fieldType)) { fields[i].setLong(objName, cursor.getLong(fieldIndex)); } else if ("float".equals(fieldType)) fields[i] .setFloat(objName, cursor.getFloat(fieldIndex)); else if ("double".equals(fieldType)) fields[i].setDouble(objName, cursor.getDouble(fieldIndex)); else if ("short".equals(fieldType)) fields[i] .setShort(objName, cursor.getShort(fieldIndex)); else if ("char".equals(fieldType)) fields[i].setChar(objName, cursor.getString(fieldIndex) .charAt(0)); } // 保存当前的实例对象 resultObj.add(objName); // showMsg("resultObj==" + resultObj.size()); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } } cursor.close(); return resultObj; }
/** * * @Title: getField * @Description: 获得对象的所有字段,包括其父类(如果有) * @param @param clazz * @param @return * @return Field[] * @throws */ private Field[] getField(Class clazz) { Field[] childfields = clazz.getDeclaredFields(); Field[] superFields = clazz.getSuperclass().getDeclaredFields(); Field[] fields = new Field[childfields.length + superFields.length]; System.arraycopy(childfields, 0, fields, 0, childfields.length); System.arraycopy(superFields, 0, fields, childfields.length, superFields.length); return fields; }
相关文章推荐
- Android studio无法发现nexus 5x解决方法
- android布局之线性布局LinearLayout(总结)
- Android开发的那些坑和小技巧
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- [Android 6.0] 程序开发(一)--运行时请求权限
- Android 开源项目分类汇总
- Android 测量类MeasureSpec
- Android采用服务执行长期后台的操作
- Android签名机制之—签名过程详解
- Ubuntu下载Android最新源码
- 梆梆SDKs详细分析 - 防界面劫持SDK 推荐
- android中adapter.clear()引起的错误
- Android中Drawable
- 将eclipse代码导入到Android Studio
- monkeytalk 启动、关闭 android应用程序 解决方法
- AndroidStudio与gradle
- Android之fragment生命周期
- Android Volley框架的使用(2)
- android 百度地图SDK 3.7.0 周边雷达-Radar 周边搜索-PoiSearch
- AsyncTask和Handler两种异步方式的实现和区别比较