本教程针对JDK 8编写。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言变更以获取Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发布说明以获取有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
数组类型可以通过调用Class.isArray()来识别。要获取一个Class,可以使用本教程中检索类对象一节中描述的方法之一。
示例会识别命名类中的数组类型字段,并报告每个字段的组件类型。ArrayFind
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import static java.lang.System.out;
public class ArrayFind {
public static void main(String... args) {
boolean found = false;
try {
Class<?> cls = Class.forName(args[0]);
Field[] flds = cls.getDeclaredFields();
for (Field f : flds) {
Class<?> c = f.getType();
if (c.isArray()) {
found = true;
out.format("%s%n"
+ " 字段名: %s%n"
+ " 类型: %s%n"
+ " 组件类型: %s%n",
f, f.getName(), c, c.getComponentType());
}
}
if (!found) {
out.format("没有数组字段%n");
}
// 实际代码应更优雅地处理此异常
} catch (ClassNotFoundException x) {
x.printStackTrace();
}
}
}
Class.get*Type()的返回值语法在Class.getName()中有描述。类型名称开头的'['字符的数量表示数组的维度(即嵌套的深度)。
以下是输出示例。用户输入以斜体表示。原始类型byte的数组:
$java ArrayFind java.nio.ByteBuffer
final byte[] java.nio.ByteBuffer.hb
字段名: hb
类型: class [B
组件类型: byte
引用类型StackTraceElement的数组:
$ java ArrayFind java.lang.Throwable
private java.lang.StackTraceElement[] java.lang.Throwable.stackTrace
字段名: stackTrace
类型: class [Ljava.lang.StackTraceElement;
组件类型: class java.lang.StackTraceElement
predefined是一维的引用类型java.awt.Cursor数组,而cursorProperties是二维的引用类型String数组:
$ java ArrayFind java.awt.Cursor
protected static java.awt.Cursor[] java.awt.Cursor.predefined
字段名: predefined
类型: class [Ljava.awt.Cursor;
组件类型: class java.awt.Cursor
static final java.lang.String[][] java.awt.Cursor.cursorProperties
字段名: cursorProperties
类型: class [[Ljava.lang.String;
组件类型: class [Ljava.lang.String;