Java:在运行时创建具有不同名称的数组对象并访问/更新它们

时间:2010-04-03 03:28:39

标签: java reflection

我正在尝试创建一个可以在运行时通过为每个数组赋予createtempobjectname()方法创建的“名称”来实例化数组的类。我在运行这个程序时遇到了麻烦。我还想看看如何访问在运行时创建的特定对象,以及通过更改值或访问它们来访问这些数组。到目前为止,这是我的混乱,它编译但获得运行时异常。

import java.lang.reflect.Array;

public class arrays
{
    private static String temp;
    public static int name = 0;
    public static Object o;
    public static Class c;

        public static void main(String... args)
        {
            assignobjectname();
            //getclassname();//this is supposed to get the name of the object and somehow 
                             //allow the arrays to become updated using more code?
        }
        public static void getclassname()
        {
            String s = c.getName();
            System.out.println(s);
        }
        public static void assignobjectname()//this creates the object by the name returned
        {                                    //createtempobjectname()
             try
             {
              String object = createtempobjectname();
                c = Class.forName(object);
                o = Array.newInstance(c, 20);
             }
             catch (ClassNotFoundException exception)
             {
                exception.printStackTrace();
             }
        }
        public static String createtempobjectname()
        {
            name++;
            temp = Integer.toString(name);

            return temp;
        }
}

3 个答案:

答案 0 :(得分:3)

创建一个地图,然后当键是你的名字并且值是你的数组时你可以添加键/值对。

答案 1 :(得分:0)

我希望你从这一行获得ClassNotFoundException

c = Class.forName(object);

第一次调用时object的值为“1”,这不是有效的类名。

Class.forName需要一个类名作为输入,例如"java.lang.Integer"。试图以这种方式“命名”你的阵列对我来说没有意义。您需要选择适当的Java类名。

如果要“命名”一个数组实例(在创建它之后),您可以始终将该实例存储为Map中的值,并使用名称作为键。

答案 2 :(得分:0)

来自@ Ash的回答,这是一些说明性的代码。请注意,没有涉及反射。

Map<String, Object> myMap = new HashMap<String, Object>();
...
Object myObject = ...
myMap.put("albert", myObject);  // record something with name "albert"
...
Object someObject = myMap.get("albert");  // get the object named "albert"
// get("albert") would return null if there nothing with name "albert"

编辑我编辑了示例以使用Object类型,因为它与您尝试执行的操作更加一致(我认为)。但是您可以使用任何类型而不是Object ...只需在整个示例中替换类型。你可以用ArrayList做同样的事情;例如:

List<Date> dates = new ArrayList<Date>();
dates.add(new Date());
Date firstDate = dates.get(0);

请注意,不需要进行类型转换。