黑马程序员技术交流社区

标题: 对数组的反射的 问题 [打印本页]

作者: XinWen    时间: 2014-5-4 16:01
标题: 对数组的反射的 问题
  1. public static void arrayReflect(Object pObject) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
  2.                 if(pObject.getClass().isArray()){
  3.                         Field _Len = pObject.getClass().getDeclaredField("length");
  4.                         _Len.setAccessible(true);
  5.                         System.out.println(_Len.get(pObject));
  6.                 }else{
  7.                         System.out.println(pObject);
  8.                 }
  9.         }
复制代码
我不按 张老师 说的那样对 数组进行反射,而是 直接 找到, 数组中的 length 字段, 可是 运行时 出错,找不到这个 字段,请问大家 这是为什么

作者: ò壞尛孩    时间: 2014-5-4 16:52
Field _Len = pObject.getClass().getDeclaredField("length");
_Len.setAccessible(true);
System.out.println(_Len.get(pObject));
红色的代码:如果说你这pObject是数组那么 pObject.getClass()获得是这个数组类型的字节码文件, boolean isArray()
          判定此 Class 对象是否表示一个数组类。
是class的方法这是允许的,而你通过对字节码文件暴力反射取到length这个parameter变量,是不允许的!(你这句话的意思是取这个字节码的length成员,而不是数组的成员length)
应该通过Array.getLength(pObject)取得这个数组对象的length!
如果你偏要这么做  你要重写个数组类继承java.util.Arrays  !并且增加一个length变量!

作者: XinWen    时间: 2014-5-4 18:20
ò壞尛孩 发表于 2014-5-4 16:52
Field _Len = pObject.getClass().getDeclaredField("length");
_Len.setAccessible(true);
System.out.pri ...

感谢 回答   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2