黑马程序员技术交流社区

标题: 数组利用反射得到自己的类型?为什么? [打印本页]

作者: 刘郑瑞    时间: 2013-1-21 22:45
标题: 数组利用反射得到自己的类型?为什么?
数组利用反射得到自己的类型?为什么?
作者: 王勇文    时间: 2013-1-21 23:13
描述java中所有的类文件的类就是Class类。而某个类的类文件就是Class类的实例对象。类文件就是类加载到内存中的那份字节码文件。

•得到一个类的字节码文件的三种方式
1.       直接通过类名的.class得到 如Date.class每一种类型都有自己对应的字节码文件。这些字节码文件都是Class类型的实例对象。
       都可以通过调用相应类型的.class得到这种类型的字节码文件。   需要提前知道类名。

2.       通过这个类产生的对象的.getClass方法得到    (需要提前知道类名)
  如:Date date1=new Date();
     date1.getClass();

3.       通过Class类的静态方法forName()方法得到
  如: Class.forName(“java.util.Date”),
   这个方法可以通过需要得到字节码的类名的字符串来得到这个类的字节码,不需要提前知道类的类名,将这个类的类名作为参数传入。
  例如int.class,int[].class,void.class

作者: 李敬卫    时间: 2013-1-21 23:16
public class ShuZu2 {
//数组的反射
public static void printObject(Object obj){
        Class<?> clazz=obj.getClass();
        if(clazz.isArray()){
                int len=Array.getLength(obj);
        for(int i=0;i<len;i++)        {
                System.out.print(Array.get(obj, i));
               
        }
        System.out.println();
        }else{
                System.out.println(obj);
        }
}
        public static void main(String[] args) {
               
                 int [] a1=new int[]{1,2,3};
               
                 String[] a4=new String[]{"hha","ssjd","hdjhf"};
                 printObject("zhangsan");
                 printObject(a1);
                 printObject(a4);
        }
}
就像这段代码通过Class的isArray()方法判断所传入的是否是一个数组类,如果是,就用Array.get(obj, i))方法打印出数组中的指定索引处的值。
作者: 黑马张旭    时间: 2013-1-22 13:23
数组的反射及应用

a、具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。

b、代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类
对应的Class.

c、基本类型的一维数组可以被当作Objcet类型使用,不能当作Object[]类型使用。
;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用
d、Arrays.asList()方法处理int[]和String[]时,有差异。

e、Array工具类用于完成对数组的反射操作

f、怎么得到数组元素的类型

无法得到数组的类型,但可以得到数组元素的类型

int [] a = new int [3];

Object[] a = new Object[]{“a”,1};

a[0].getClass().getName(); //这里可以得到某个元素的类型

注意代码注释部为什么不能通过编译:下有无法通过图
  1.     import java.lang.reflect.Array;  
  2.       
  3.     import java.util.Arrays;  
  4.       
  5.     public class ArrayOfReflect {  
  6.       
  7.         public static void main(String[] args) {  
  8.       
  9.            int [] a1 = new int[]{1,2,3};  
  10.       
  11.            int [] a2 = new int[4];  
  12.       
  13.            int[][] a3 = new int [2][3];  
  14.       
  15.            String[] a4 = new String[]{"a", "b", "c"};  
  16.       
  17.            System.out.println(a1.getClass() == a2.getClass());  
  18.       
  19.            /*
  20.      
  21.             * 所有类型相同和维数相同的数组它的的类字节码都是一样的
  22.      
  23.             * a1的类字节码 与a3、a4的类字节码永远都不会一样
  24.      
  25.             * jdk1.5以后,编译器认为这2个类型是不一样的。
  26.      
  27.             * 根本没有比较的需要。对于总是不成立的比较,其实是没有意义的
  28.      
  29.             * 所以编译器会报错!  
  30.      
  31.            System.out.println(a1.getClass() == a4.getClass());
  32.      
  33.            System.out.println(a1.getClass() == a3.getClass());
  34.      
  35.            */  
  36.       
  37.            System.out.println(a1.getClass().getName());  
  38.       
  39.            System.out.println(a1.getClass().getSuperclass().getName());  
  40.       
  41.            System.out.println(a4.getClass().getSuperclass().getName());  
  42.       
  43.            Object aObj1 = a1;  
  44.       
  45.            Object aObj2 = a4;  
  46.       
  47.     //     Object[] aObj3 = a1;  
  48.       
  49.            Object[] aObj4 = a3;  
  50.       
  51.            Object[] aObj5 = a4;  
  52.       
  53.            System.out.println(a1);  
  54.       
  55.            System.out.println(a4);  
  56.       
  57.            System.out.println(Arrays.asList(a1));  
  58.       
  59.     //     注意这里为什么不能打印出a1里的值,为了兼容jdk1.4,但jdk1.4只能传Object[]  
  60.       
  61.     //     但a1是基本数据类型,无法打印出里面的值,那怎样解决呢  下面通过自己编写方法,来打印  
  62.       
  63.            System.out.println(Arrays.asList(a4));  
  64.       
  65.             printObject(a1);  
  66.       
  67.         }  
  68.       
  69.         private static void printObject(Object obj) {  
  70.       
  71.            Class clazz = obj.getClass();  
  72.       
  73.            if (clazz.isArray()) {  
  74.       
  75.                int len = Array.getLength(obj);  
  76.       
  77.                for (int i = 0; i < len; i++) {  
  78.       
  79.                   System.out.print(Array.get(obj, i));  
  80.       
  81.                }  
  82.       
  83.            } else {  
  84.       
  85.                System.out.println(obj);  
  86.       
  87.            }  
  88.       
  89.         }  
  90.       
  91.     }  

  92. 运行结果:

  93. true

  94. [I

  95. java.lang.Object

  96. java.lang.Object

  97. [I@de6ced

  98. [Ljava.lang.String;@c17164

  99. [[I@de6ced]

  100. [a, b, c]

  101. 1

  102. 2

  103. 3
复制代码

作者: 黑马张英涛    时间: 2013-1-22 20:39
通过反射是可以得到数组的类型的,张老师可能没注意到这个方法:
getComponentType
public Class<?> getComponentType()
返回表示数组组件类型的 Class。如果此类不表示数组类,则此方法返回 null。
返回:如果此类是数组,则返回表示此类组件类型的 Class
从以下版本开始: JDK1.1
另请参见:Array

示例代码:
  1. public static void main(String[] args) {
  2.                  boolean[] nums=new boolean[4];
  3.                  Object[] objs=new Object[]{"abc",5,true,'b'};
  4.                  
  5.                  System.out.println(objs.getClass());
  6.                  System.out.println(objs.getClass().getName());
  7.                  System.out.println("==============");
  8.                  System.out.println(nums.getClass().getComponentType());
  9.                  System.out.println(objs.getClass().getComponentType());
  10.                  System.out.println("==============");
  11.                  for(Object obj : objs){
  12.                          System.out.println(obj.getClass());
  13.                  }
  14.         }
复制代码
输出结果为:
class [Ljava.lang.Object;
[Ljava.lang.Object;
==============
boolean
class java.lang.Objec
t

==============
class java.lang.String
class java.lang.Integer
class java.lang.Boolean
class java.lang.Character






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