文档

Java™ 教程
隐藏目录
创建新数组
导航: 反射API
课程: 数组和枚举类型
章节: 数组

创建新数组

与非反射代码一样,反射支持通过 java.lang.reflect.Array.newInstance() 动态创建任意类型和维度的数组的能力。考虑一个名为 ArrayCreator 的基本解释器,它能够动态创建数组。将解析的语法如下所示:

fully_qualified_class_name variable_name[] = 
     { val1, val2, val3, ... }

假设 fully_qualified_class_name 表示一个具有单个 String 参数的构造函数的类。数组的维度由提供的值的数量确定。下面的示例将构造一个 fully_qualified_class_name 类型的数组实例,并使用 val1val2 等实例填充其值。(此示例假设熟悉 Class.getConstructor()java.lang.reflect.Constructor.newInstance()。有关反射 API 的 Constructor 的讨论,请参阅本教程的 创建新类实例 部分。)

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Arrays;
import static java.lang.System.out;

public class ArrayCreator {
    private static String s = "java.math.BigInteger bi[] = { 123, 234, 345 }";
    private static Pattern p = Pattern.compile("^\\s*(\\S+)\\s*\\w+\\[\\].*\\{\\s*([^}]+)\\s*\\}");

    public static void main(String... args) {
        Matcher m = p.matcher(s);

        if (m.find()) {
            String cName = m.group(1);
            String[] cVals = m.group(2).split("[\\s,]+");
            int n = cVals.length;

            try {
                Class<?> c = Class.forName(cName);
                Object o = Array.newInstance(c, n);
                for (int i = 0; i < n; i++) {
                    String v = cVals[i];
                    Constructor ctor = c.getConstructor(String.class);
                    Object val = ctor.newInstance(v);
                    Array.set(o, i, val);
                }

                Object[] oo = (Object[])o;
                out.format("%s[] = %s%n", cName, Arrays.toString(oo));

            // production code should handle these exceptions more gracefully
            } catch (ClassNotFoundException x) {
                x.printStackTrace();
            } catch (NoSuchMethodException x) {
                x.printStackTrace();
            } catch (IllegalAccessException x) {
                x.printStackTrace();
            } catch (InstantiationException x) {
                x.printStackTrace();
            } catch (InvocationTargetException x) {
                x.printStackTrace();
            }
        }
    }
}
$ java ArrayCreator
java.math.BigInteger [] = [123, 234, 345]

上面的示例展示了一种可能需要使用反射来创建数组的情况;即在运行时才知道组件类型的情况下。在这种情况下,代码使用Class.forName()获取所需组件类型的类,然后调用特定的构造函数来初始化数组的每个组件,并设置相应的数组值。


上一页: 识别数组类型
下一页: 获取和设置数组及其组件