• 【译】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反射——类的动态加载和重新加载

    (敬请期待下一篇翻译)

  • 相关阅读:
    NTP on FreeBSD 12.1
    Set proxy server on FreeBSD 12.1
    win32 disk imager使用后u盘容量恢复
    How to install Google Chrome Browser on Kali Linux
    Set NTP Service and timezone on Kali Linux
    Set static IP address and DNS on FreeBSD
    github博客标题显示不了可能是标题包含 特殊符号比如 : (冒号)
    server certificate verification failed. CAfile: none CRLfile: none
    删除文件和目录(彻底的)
    如何在Curl中使用Socks5代理
  • 原文地址:https://www.cnblogs.com/penghongwei/p/3300094.html
Copyright © 2020-2023  润新知