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

Java:在运行时创建具有不同名称的数组对象并访问/更新它们,java,reflection,Java,Reflection,我试图创建一个类,通过给每个数组一个createtempobjectname方法创建的名称,该类可以在运行时实例化数组。我无法运行此程序。我还想看看如何访问在运行时创建的特定对象,并通过更改值或访问它们来访问这些数组。这是我到目前为止的混乱,它编译了,但得到了一个运行时异常 import java.lang.reflect.Array; public class arrays { private static String temp; public static int nam

我试图创建一个类,通过给每个数组一个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;
        }
}

创建一个映射,然后当键是您的名称,值是您的数组时,您可以添加键/值对。

我希望您从这一行获得ClassNotFoundException:

c = Class.forName(object);
第一次调用对象的值为1,这不是有效的类名

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


如果要在创建数组实例后命名该实例,可以始终将该实例作为值存储在映射中,并使用名称作为键。

继@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"
编辑我已经编辑了这个示例以使用type对象,因为我认为这与您尝试执行的操作更接近。但是你可以使用任何类型而不是对象。。。只需在整个示例中替换该类型。您可以对ArrayList执行相同的操作;例如:

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

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

如果您能解释一下为什么要这样做,这将非常有帮助。对于你想要完成的事情,可能有一种比你在这里想要做的事情更清晰的方法。这些阵列有什么意义?为什么他们需要被命名?您将在它们中存储什么?它们需要命名,因为没有其他方法来区分两个或多个对象。这类似于存储ArrayList,但我认为每次需要访问ArrayList时从对象中提取字符串太慢了。很抱歉,我缺乏经验,但我对Java有点陌生,甚至从未使用过映射。我想知道你是否可以给我一个例子。如果一个名为albert的对象最初存储了一个字符串,我是否需要将它转换为一个字符串?通常,对于一个只存储一个对象的ArrayList,这是必需的,从中读取需要强制转换?我该如何写/读albert,或者myMap.getalbert就是这么做的?谢谢你到目前为止的帮助,我没有饼干可以给,因为我没有名声。我现在明白了,我想这解决了问题。我该如何表示呢?你应该选择最有用的答案作为解决方案,将你的问题标记为已回答,并投票选出有助于你理解和解决问题的答案。