从另一个类访问静态的ArrayList始终是空的(Static ArrayList accessed

2019-10-19 02:42发布

我有以下类

import java.util.ArrayList;
import java.util.List;

public class TestStaticArrayList {

    public static List<String> numberList = new ArrayList<String>();

    public static List<String> getArrayValues(){
    return numberList;
    }

    public static void populateArray() {
    numberList.add("1");
    numberList.add("2");
    numberList.add("3");        
    }
}

在上述类中的静态的ArrayList是从以下类的呼叫动态地填充。

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class TestStaticInvokationClass {

    public static void main(String[] args) throws Exception {

    Class staticKlass = Class
        .forName("com.sathish.test.TestStaticArrayList");
    staticKlass.getMethod("populateArray", null).invoke(null, null);
    }
}

我试图访问静态的ArrayList在下面class.But它总是空的。

public class StaticArrayListAccessTest {

    public static void main(String[] args) throws Exception {   
    System.out.println(TestStaticArrayList.getArrayValues());

    }
}

如果我使用一个

static {
...
}

填充它工作正常ArrayList中。 我有其中该ArrayList填充动态这意味着我block.How可以在这种情况下访问静态的ArrayList我不能使用静态{..}的使用情况。

任何帮助表示赞赏。

Answer 1:

静态字段保留其整个程序执行价值,但只在一个执行。 静态字段的目的是提供一个值,而无需获得任何类的一个实例。 只有一个主要方法将被隐式调用因此无论是名单将被填充和遗忘,或空列表会从其他入口点读取。

究其原因static { }块的工作是他们可以运行某个检索列表之前, 无论切入点

下面将为此努力:

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class TestStaticInvokationClass {

    public static void main(String[] args) throws Exception {

    Class staticKlass = Class
        .forName("com.sathish.test.TestStaticArrayList");
    staticKlass.getMethod("populateArray", null).invoke(null, null);
    System.out.println(TestStaticArrayList.getArrayValues());
    }
}

它将填充ArrayList中,然后尝试在同一个执行读取它。

无论如何 ,你不必使用反射,因为它是慢,风险较大,且无正当理由在这种情况下。 简单地做如下:

TestStaticArrayList.populateArray();


Answer 2:

从评论说:“是的,我是为什么它有静态块,而不是静态方法的工作原理好奇”

当一个类被初始化静态初始化块被自动调用 。 当TestStaticArrayList初始化? 就在这里,当你访问它的静态方法之一/首次字段( 这里更多的是初始化):

System.out.println(TestStaticArrayList.getArrayValues());

静态初始化块将已经在打印结果运行。 但是,如果你没有任何静态初始化块,再有就是在代码中没有的地方进行了ArrayList填充。 这就是为什么在你的第二个方案ArrayList是空的。 你要么填充它在静态初始化块,它是自动运行,或者您叫populateArray()显式地打印其值之前。



Answer 3:

这将是空的,当然。 该方法populateArray()不会被调用。 如果您需要查看填充的列表,你需要这样做:

TestStaticArrayList.populateArray();
TestStaticArrayList.getArrayValues();

仅供参考,我强烈建议你改变你的代码结构。 这是有原因的静态动态两个非常不同的概念!



Answer 4:

一类是不只是“执行”,因为它有一个main方法。 这种方法是一个切入点来启动程序。 你必须明确地调用相应的方法,如果这不是你的切入点。

当你调用TestStaticArrayList.getArrayValues()不会执行main在那里方法。

如果执行两次的程序也不会知道这是在列表中的最后一次值:每件作品从海誓山盟分开。



文章来源: Static ArrayList accessed from another class is always empty