A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

数组利用反射得到自己的类型?为什么?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
描述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

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
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))方法打印出数组中的指定索引处的值。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
数组的反射及应用

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
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
通过反射是可以得到数组的类型的,张老师可能没注意到这个方法:
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

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马