以名称String形式访问Java变量

时间:2015-06-16 10:00:50

标签: java

我已宣布10个ArrayList名为arraylist1arraylist2,依此类推。

我想在for循环中动态更改变量名称:

for (int i = 1; i < 5; i++)
{
   arraylist + (i).clear();
   //arraylist1.clear();
   //arraylist2.clear();
   //arraylist3.clear();
   //arraylist4.clear();
   //arraylist5.clear();

}

有可能吗?如果是这样的格式是什么?

3 个答案:

答案 0 :(得分:8)

您无法使用其名称作为字符串来处理变量(除了反射,但这对此任务来说太过分了。)

您可以将所有这些ArrayList添加到另一个List。这更灵活,因此是更好的选择。

<add name="testdb" connectionString="Data Source=mydbserver;" providerName="System.Data.SqlClient"/>

或者将它们添加到数组中并通过数组索引访问它们:

List<List<ContactDetails>> lists2 = new ArrayList<List<String>>();
for (int i = 0; i < 10; i++) {
    lists2.add(new ArrayList<ContactDetails>());
}

现在:

@SuppressWarnings("unchecked")
List<ContactDetails>[] lists = new List[10];
for (int i = 0; i < lists.length; i ++) {
    lists[i] = new ArrayList<ContactDetails>();
}

由于List和数组都是Iterable,您可以使用foreach语法:

for (int i = 1; i < 5; i++)
{
   lists[i].clear();
   lists2.get(i).clear();
}

如果您知道如何使用Lambdas / Stream API实现相同功能,请添加答案。

答案 1 :(得分:1)

如果ArrayList是类属性,则可以使用reflection实现此目的:

((ArrayList) getClass().getField("arraylist" + i).get(this)).clear();

答案 2 :(得分:1)

你也可以用反射做到这一点。但我不推荐它。

public class SoTest {

    @Test
    public void testWithReflection() throws Exception {
        final MyClass myClass = new MyClass();
        for (int i = 0; i < 10; i++) {
            final Field field = myClass.getClass().getDeclaredField("list" + i);
            field.setAccessible(true);
            final List<String> value = (List<String>) field.get(myClass);
            value.clear();
        }
    }

    class MyClass {
        private List<String> list0 = new ArrayList<>();
        private List<String> list1 = new ArrayList<>();
        private List<String> list2 = new ArrayList<>();
        private List<String> list3 = new ArrayList<>();
        private List<String> list4 = new ArrayList<>();
        private List<String> list5 = new ArrayList<>();
        private List<String> list6 = new ArrayList<>();
        private List<String> list7 = new ArrayList<>();
        private List<String> list8 = new ArrayList<>();
        private List<String> list9 = new ArrayList<>();
    }
}