android5.1后新增shadow$_monitor_和shadow$_klass_ ,导致反射无效
来源:互联网 发布:开淘宝微店能赚钱吗 编辑:程序博客网 时间:2024/06/08 18:32
转自:http://blog.csdn.net/huyuchaoheaven/article/details/48708281
简单来说就是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;}
0 0
- android5.1后新增shadow$_monitor_和shadow$_klass_ ,导致反射无效
- shadow$_monitor_和shadow$_klass_
- shadow$_monitor_和shadow$_klass_
- shadow
- shadow
- shadow
- shadow
- shadow
- box-shadow和text-shadow
- shadow! shadow!
- CSS3 box-shadow和text-shadow
- CSS3的text-shadow和box-shadow
- box-shadow和text-shadow两者比较
- text-shadow和box-shadow用法
- passwd和shadow
- passwd和shadow格式
- passwd 和shadow详解
- Shadow Map & Shadow Volume
- 爬虫学习 基本打开网页操作
- 滑动隐藏标题栏布局ListView
- 创建字符串对象的时候,使用字面值和使用new String()构造器这两种方式有什么不同?
- junit 使用JUnit测试预期异常
- 微信红包随机算法初探
- android5.1后新增shadow$_monitor_和shadow$_klass_ ,导致反射无效
- linux开发调试工具---GDB的使用
- 流媒体技术
- CodeForces NO.197B Limit
- round、ceil、floor
- 转发和重定向的区别
- HTML5:定制表单
- [BZOJ2049]洞穴勘测[BZOJ2157]旅游Link-Cut Tree模板题
- Android Annotation基础教程