Java Reflection(十):数组
来源:互联网 发布:vue.js生命周期面试题 编辑:程序博客网 时间:2024/05/01 13:34
原文地址 作者: Jakob Jenkov 译者:叶文海(yewenhai@gmail.com)
内容索引
java.lang.reflect.Array
创建一个数组
访问一个数组
获取数组的Class对象
获取数组的成员类型
利用反射机制来处理数组会有点棘手。尤其是当你想要获得一个数组的Class对象,比如int[]等等。本节会讨论通过反射机制创建数组和如何获取数组的Class对象。
注意:在阅读Eyal Lupu的博客文章“Two Side Notes About Arrays and Reflection”之后对本文的内容做了更新。目前这个版本参考了这篇博文里面的内容。
java.lang.reflect.Array
Java反射机制通过java.lang.reflect.Array这个类来处理数组。不要把这个类与Java集合套件(Collections suite)中的java.util.Arrays混淆,java.util.Arrays是一个提供了遍历数组,将数组转化为集合等工具方法的类。
创建一个数组
Java反射机制通过java.lang.reflect.Array类来创建数组。下面是一个如何创建数组的例子:
1
int
[] intArray = (
int
[]) Array.newInstance(
int
.
class
,
3
);
这个例子创建一个int类型的数组。Array.newInstance()方法的第一个参数表示了我们要创建一个什么类型的数组。第二个参数表示了这个数组的空间是多大。
访问一个数组
通过Java反射机制同样可以访问数组中的元素。具体可以使用Array.get(…)和Array.set(…)方法来访问。下面是一个例子:
1
int
[] intArray = (
int
[]) Array.newInstance(
int
.
class
,
3
);
2
3
Array.set(intArray,
0
,
123
);
4
Array.set(intArray,
1
,
456
);
5
Array.set(intArray,
2
,
789
);
6
7
System.out.println(
"intArray[0] = "
+ Array.get(intArray,
0
));
8
System.out.println(
"intArray[1] = "
+ Array.get(intArray,
1
));
9
System.out.println(
"intArray[2] = "
+ Array.get(intArray,
2
));
这个例子会输出:
1
intArray[
0
] =
123
2
intArray[
1
] =
456
3
intArray[
2
] =
789
获取数组的Class对象
在我编写Butterfly DI Container的脚本语言时,当我想通过反射获取数组的Class对象时遇到了一点麻烦。如果不通过反射的话你可以这样来获取数组的Class对象:
1
Class stringArrayClass = String[].
class
;
如果使用Class.forName()方法来获取Class对象则不是那么简单。比如你可以像这样来获得一个原生数据类型(primitive)int数组的Class对象:
1
Class intArray = Class.forName(
"[I"
);
在JVM中字母I代表int类型,左边的‘[’代表我想要的是一个int类型的数组,这个规则同样适用于其他的原生数据类型。
对于普通对象类型的数组有一点细微的不同:
1
Class stringArrayClass = Class.forName(
"[Ljava.lang.String;"
);
注意‘[L’的右边是类名,类名的右边是一个‘;’符号。这个的含义是一个指定类型的数组。
需要注意的是,你不能通过Class.forName()方法获取一个原生数据类型的Class对象。下面这两个例子都会报ClassNotFoundException:
1
Class intClass1 = Class.forName(
"I"
);
2
Class intClass2 = Class.forName(
"int"
);
我通常会用下面这个方法来获取普通对象以及原生对象的Class对象:
1
public
Class getClass(String className){
2
if
(
"int"
.equals(className))
return
int
.
class
;
3
if
(
"long"
.equals(className))
return
long
.
class
;
4
...
5
return
Class.forName(className);
6
}
一旦你获取了类型的Class对象,你就有办法轻松的获取到它的数组的Class对象,你可以通过指定的类型创建一个空的数组,然后通过这个空的数组来获取数组的Class对象。这样做有点讨巧,不过很有效。如下例:
1
Class theClass = getClass(theClassName);
2
Class stringArrayClass = Array.newInstance(theClass,
0
).getClass();
这是一个特别的方式来获取指定类型的指定数组的Class对象。无需使用类名或其他方式来获取这个Class对象。
为了确保Class对象是不是代表一个数组,你可以使用Class.isArray()方法来进行校验:
1
Class stringArrayClass = Array.newInstance(String.
class
,
0
).getClass();
2
System.out.println(
"is array: "
+ stringArrayClass.isArray());
获取数组的成员类型
一旦你获取了一个数组的Class对象,你就可以通过Class.getComponentType()方法获取这个数组的成员类型。成员类型就是数组存储的数据类型。例如,数组int[]的成员类型就是一个Class对象int.class。String[]的成员类型就是java.lang.String类的Class对象。
下面是一个访问数组成员类型的例子:
1
String[] strings =
new
String[
3
];
2
Class stringArrayClass = strings.getClass();
3
Class stringArrayComponentType = stringArrayClass.getComponentType();
4
System.out.println(stringArrayComponentType);
下面这个例子会打印“java.lang.String”代表这个数组的成员类型是字符串。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java Reflection(十):数组
- Java Reflection(十):数组
- Java Reflection(十):数组
- Java Reflection(十):数组
- Java 数组反射(Array Reflection)
- Java Reflection
- Java Reflection
- Java Reflection
- Java Reflection
- java Reflection
- Java Reflection
- java reflection
- Java Reflection
- java reflection
- Java reflection
- Java Reflection
- java reflection
- JAVA Reflection
- JAVA Reflection
- web测试方法总结
- UITextField的创建与方法的重写
- 输出形如aabb的4位完全平方数(7744问题)
- spring session无法实现共享(多web应用)
- tensorboard
- Java Reflection(十):数组
- 以域管理账户连接到TFS或git时,设置IE允许Cookies
- Linux修改/etc/profile配置错误command is not found自救方法
- Mysql的Root密码忘记,查看或修改的解决方法
- 浅谈MVC,MVP,MVVM区别与联系
- 最小深度
- CCF201604-3 路径解析(解法三)(90分)
- Vim命令#Vim常用基础命令
- RabbitMQ 安装和配置