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

sat*_*isa 1 java static static-methods arraylist static-members

我有以下课程

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");        
    }
}
Run Code Online (Sandbox Code Playgroud)

上面类中的静态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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图访问下面的类中的静态ArrayList.但它总是为空.

public class StaticArrayListAccessTest {

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

    }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用

static {
...
}
Run Code Online (Sandbox Code Playgroud)

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

对此有任何帮助表示赞赏.

ζ--*_*ζ-- 5

静态字段并没有保留其整个程序执行价值,但只在一个执行.静态字段的目的是使值可用而无需获取任何类的实例.只会隐式调用一个main方法,因此列表将被填充和遗忘,或者空列表将从另一个入口点读取.

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

无论如何,你不需要使用反射,因为它在这种情况下更慢,风险更大,更无根据.只需按以下步骤操作:

TestStaticArrayList.populateArray();
Run Code Online (Sandbox Code Playgroud)