我有以下类
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我不能使用静态{..}的使用情况。
任何帮助表示赞赏。
静态字段不保留其整个程序执行价值,但只在一个执行。 静态字段的目的是提供一个值,而无需获得任何类的一个实例。 只有一个主要方法将被隐式调用因此无论是名单将被填充和遗忘,或空列表会从其他入口点读取。
究其原因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();
从评论说:“是的,我是为什么它有静态块,而不是静态方法的工作原理好奇”
当一个类被初始化静态初始化块被自动调用 。 当TestStaticArrayList
初始化? 就在这里,当你访问它的静态方法之一/首次字段( 这里更多的是初始化):
System.out.println(TestStaticArrayList.getArrayValues());
静态初始化块将已经在打印结果运行。 但是,如果你没有任何静态初始化块,再有就是在代码中没有的地方进行了ArrayList
填充。 这就是为什么在你的第二个方案ArrayList
是空的。 你要么填充它在静态初始化块,它是自动运行,或者您叫populateArray()
显式地打印其值之前。
这将是空的,当然。 该方法populateArray()
不会被调用。 如果您需要查看填充的列表,你需要这样做:
TestStaticArrayList.populateArray();
TestStaticArrayList.getArrayValues();
仅供参考,我强烈建议你改变你的代码结构。 这是有原因的静态和动态两个非常不同的概念!
一类是不只是“执行”,因为它有一个main
方法。 这种方法是一个切入点来启动程序。 你必须明确地调用相应的方法,如果这不是你的切入点。
当你调用TestStaticArrayList.getArrayValues()
不会执行main
在那里方法。
如果执行两次的程序也不会知道这是在列表中的最后一次值:每件作品从海誓山盟分开。