zoukankan      html  css  js  c++  java
  • 【译】10. Java反射——数组

    原文地址:http://tutorials.jenkov.com/java-reflection/arrays.html

    ===================================================================================== 

         用Java反射来处理数组有时候是技巧性很强的。特别是如果你需要获取一个给定类型的数组的Class对象,像int[ ]等。本文将讲述怎么用Java反射来创建数组和获取数组的Class对象。
         下面是所涵盖的主题列表:

    1. java.lang.reflect.Array 
    2. Creating Arrays 
    3. Accessing Arrays
    4. Obtaining the Class Object of an Array
    5. Obtaining the Component Type of an Array

    ===================================================================================== 

    • java.lang.reflect.Array 

         通过Java反射来处理数组需要用到java.lang.reflect.Array类。不要和Java集合中的java.util.Arrays类搞混淆了,它包含一些工具方法,像给数组排序、将数组转换成集合等。
    ===================================================================================== 

    • Creating Arrays

         通过Java反射来创建数组需要用到java.lang.reflect.Array类。下面的这个例子中会展示如何去创建一个数组:

    int[] intArray = (int[]) Array.newInstance(int.class, 3);

         这段代码示例创建了一个int型的数组。Array.newInstance( )方法的第一个参数int.class指定了数组中的每个元素应该是什么类型。第二个参数声明了该数组应该为多少个元素开辟空间。

    ===================================================================================== 

    • Accessing Arrays

       也可以通过Java反射来访问数组中的元素。这是通过Array.get(…)和Array.set(…)方法做到的。下面是一个例子:

    int[] intArray = (int[]) Array.newInstance(int.class, 3);
    
    Array.set(intArray, 0, 123);
    Array.set(intArray, 1, 456);
    Array.set(intArray, 2, 789);
    
    System.out.println("intArray[0] = " + Array.get(intArray, 0));
    System.out.println("intArray[1] = " + Array.get(intArray, 1));
    System.out.println("intArray[2] = " + Array.get(intArray, 2));

     

         这段代码示例输出如下:

    intArray[0] = 123
    intArray[1] = 456
    intArray[2] = 789

    ===================================================================================== 

    • Obtaining the Class Object of an Array      

      我在Butterfly DI Container项目中开发脚本语言时遇到一个问题,如何通过Java反射获得数组的Class对象。不用反射你可以这样做:

    Class stringArrayClass = String[].class;

     

         对数组用Class.forName()不是很直观。例如,你可以像这样访问基本类型数组的Class对象:

     

    Class intArray = Class.forName("[I");

     

         JVM中用字母I代表int。在左边加上[(左中括号)表示我比较感兴趣的int数组的类。这对所有其他的基本类型同样有效。

         对于对象,你需要用一个稍微不同的符号:  

    Class stringArrayClass = Class.forName("[Ljava.lang.String;");

     

         注意类名左边的[L和右边的分号(;)。这表示一个你指定类型的对象的数组。

         附注,你不能用Class.forName()获取基本类型的Class对象。下面的例子都会导致ClassNotFoundException:

    Class intClass1 = Class.forName("I");
    Class intClass2 = Class.forName("int");

     

         我通常像这样做来获取基本类型和对象的类型名:

     

    public Class getClass(String className){
      if("int" .equals(className)) return int .class;
      if("long".equals(className)) return long.class;
      ...
      return Class.forName(className);
    }

     

         一旦你获取了一种类型的Class对象,你也可以很简单的获取一个数组类型的Class对象。方案,或者你叫它变通措施,是先创建一个你期望的类型的空数组,然后从这个空数组获取它的Class对象。这感觉有作弊的嫌疑,但是很有效。下面是它看起来的样子:

     

    Class theClass = getClass(theClassName);
    Class stringArrayClass = Array.newInstance(theClass, 0).getClass();

     

         这代表一个单一的、统一的访问任何类类型的数组。没有摆弄类名等。

         为了确认该Class对象的确是一个数组,你可以调用Class.isArray()来检查:

     

    Class stringArrayClass = Array.newInstance(String.class, 0).getClass();
    System.out.println("is array: " + stringArrayClass.isArray());

     

    ===================================================================================== 

    • Obtaining the Component Type of an Array

         一旦你获取了数组的Class对象,你可以通过Class.getComponentType()方法访问它的元素类型。元素类型是数组中元素的类型。例如,int[ ]数组的元素类型是int.class的Class对象。String[ ]数组的元素类型是java.lang.String的Class对象。
         下面是一个访问数组元素类型的例子:

    String[] strings = new String[3];
    Class stringArrayClass = strings.getClass();
    Class stringArrayComponentType = stringArrayClass.getComponentType();
    System.out.println(stringArrayComponentType);

     

         这个例子将会输出String数组的元素类型"java.lang.String"。

     

     ========================================================================================

    • 目录

      这是一个本教程到目前为止涵盖的主题列表:     

    1. Java反射——引言
    2. Java反射——Class对象
    3. Java反射——构造函数
    4. Java反射——字段
    5. Java反射——方法
    6. Java反射——Getter和Setter
    7. Java反射——私有字段和私有方法
    8. Java反射——注解
    9. Java反射——泛型
    10. Java反射——数组
    11. Java反射——动态代理
    12. Java反射——类的动态加载和重新加载

    (敬请期待下一篇翻译)

  • 相关阅读:
    elementUI form select验证问题
    Echart--基本属性
    Echart--饼状图
    Echart--折线图
    Echart--多个柱形图
    Echart--单个柱形图
    Echart--圆型图
    构析函数和构造函数
    心情
    图片
  • 原文地址:https://www.cnblogs.com/penghongwei/p/3300094.html
Copyright © 2011-2022 走看看