gpt4 book ai didi

java - 从另一个类访问的静态 ArrayList 始终为空

转载 作者:行者123 更新时间:2023-11-29 06:36:05 33 4
gpt4 key购买 nike

我有以下类(class)

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。但它始终是空的。

public class StaticArrayListAccessTest {

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

}
}

如果我使用一个

static {
...
}

填充 Arraylist 它工作正常。我有一个动态填充 ArrayList 的用例,这意味着我不能使用静态 {..} block 。如何在这种情况下访问静态 ArrayList。

感谢任何帮助。

最佳答案

静态字段不会在程序执行期间保留其值,但仅在一次执行中保留。静态字段的目的是使值可用而无需获取任何类的实例。只有一个主要方法将被隐式调用,因此要么填充列表并忘记,要么从另一个入口点读取空列表。

static { } block 工作的原因是它们在检索列表之前的某个时间运行,无论入口点如何

出于这个原因,以下将起作用:

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();

关于java - 从另一个类访问的静态 ArrayList 始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20482603/

33 4 0