原文地址: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反射——类的动态加载和重新加载

(敬请期待下一篇翻译)

【译】10. Java反射——数组的更多相关文章

  1. 【转载】Java反射: 数组

    原创链接:http://czj4451.iteye.com/blog/1479486 java.lang.reflect.Array Java反射机制通过Array类来处理数组,结合java.lang ...

  2. Java反射----数组操作

    1,获取数组字段 在Person类中定义了一个一维数组字段:int[] a1 = new int[]{1,2,3}; 如何通过反射技术来操作该字段? 补充:Java操作数组主要用的是Array类. @ ...

  3. 【译】1. Java反射——引言

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...

  4. 【译】2. Java反射——Class对象

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

  5. 【译】3. Java反射——构造函数

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

  6. 【译】4. Java反射——字段

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

  7. 【译】5. Java反射——方法

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

  8. 【译】6. Java反射——Getter和Setter

    原文地址:http://tutorials.jenkov.com/java-reflection/getters-setters.html ============================== ...

  9. 【译】7. Java反射——私有字段和私有方法

    原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...

随机推荐

  1. 使用python库xlsxwriter库来输出各种xlsx文件

    功能性的文章直接用几个最简单的实现表达: xlsxwriter库的核心就是其Workbook对象. 创建一个指定名字的xlsx文件: import xlsxwriter filename = '/Us ...

  2. WPF实现滚动显示的TextBlock

    在我们使用TextBlock进行数据显示时,经常会遇到这样一种情况就是TextBlock的文字内容太多,如果全部显示的话会占据大量的界面,这是我们就会只让其显示一部分,另外的一部分就让其随着时间的推移 ...

  3. Spring注解 系列之Spring常用注解总结

    参考:Spring系列之Spring常用注解总结 (1) Resource 默认是byName的方式进行bean配置,@AutoWired默认是按照byType的方式进行装配bean的:(2)Comp ...

  4. Lodop删除语句Deleted只能内嵌设计维护可用

    有些人想用类似如下的语句删除打印项,或判断后把不需要的打印项删除,这种删除语句只能在打印设计或打印维护内嵌的时候使用,打印预览内嵌也不能使用.LODOP.SET_PRINT_STYLEA(2,'Del ...

  5. Vue学习目录

    前面的话 近年来,前端框架发展火热,新的框架和名词不停地出现在开发者眼前,而且开发模式也产生了一定的变化.目前来看,前端MVVM框架的出现给开发者带来了不小的便利,其中的代表就有Angular.js. ...

  6. C#程序中设置全局代理(Global Proxy)

    1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1             //设置代理 2         WebProxy WP = new Web ...

  7. codeforces158D

    Ice Sculptures CodeForces - 158D The Berland University is preparing to celebrate the 256-th anniver ...

  8. 51-node-1649齐头并进(最短路)

    题意:中文题,没啥坑点: 解题思路:这道题一开始以为要跑两个最短路,后来发现不用,因为如果给定了铁路的线路,那么,公路一定是n个节点无向图的补图,所以,铁路和公路之间一定有一个是可以直接从1到n的,我 ...

  9. redis知识汇总

    redis是一个内存数据库,使用key-value形式在内存中管理数据. 一.redis使用场景 1.热数据存储.对于需要频繁读写的数据,可以放到redis中,不用频繁的请求数据库.再设置策略持久化到 ...

  10. 因为网络安全的重要性打算学习linux

    互联网的普及,在给人们带来巨大便利的同时,也让人们感受到网络安全隐患带给人们的不安与威胁.尤其是随着计算机技术和网络技术应用范围的不断扩充,网络安全方面存在的漏洞也越来越多,在这种情况下,如何提高网络 ...