我的类有静态块,如下所示:
public class DataProvider {
static int a;
static String b;
static {
a = readRollConfiguration();
b = readNameConfiguration();
}
public static int getRoll() {
return a;
}
}
我更改了此类的配置和调用方法,然后我获得了较旧的 a 和 b 值,直到应用程序被终止并重新启动。
那么有没有办法调用静态块以便 a 和 b 更新?
答案 0 :(得分:2)
a
和b
只需加载一次。如果您想在每次调用方法readRollConfiguration
时调用方法readNameConfiguration
和getRoll
,则必须在那里调用该方法。
public class DataProvider {
public static int getRoll() {
return readRollConfiguration();
}
}
答案 1 :(得分:1)
您正在使用 a
初始化程序块初始化静态变量b
和DataProvider
的值作为static
类初始化的一部分除非您再次更改static
值,否则值将相同。
因此,更新您的DataProvider
课程并添加reloadRollConfig()
和reloadNameConfig()
,如下所示,从配置中重新加载值:
public class DataProvider {
static int a;
static String b;
static {
a = readRollConfiguration();
b = readNameConfiguration();
}
public static int getRollConfig() {//no reload, gets the current value
return a;
}
public static int getNameConfig() {//no reload, gets the current value
return b;
}
public static int reloadAndGetRollConfig() {//reload and get the new value
a = readRollConfiguration();
return a;
}
public static int reloadAndGetNameConfig() {//reload and get the new value
b = readNameConfiguration();
return b;
}
}
是的,我知道它的坏主意,但配置不经常更改。
我强烈建议您定期重新加载a
和b
的值,以便为DataProvider
类设置最新值。您可以使用简单的调度程序或使用Ehcache等框架实现缓存层来实现此目的。缓存框架提供了许多用于缓存静态数据的功能,我建议你需要考虑为这种配置数据实现缓存(即不经常更改的数据)。
答案 2 :(得分:0)
您无法调用静态阻止。在创建Class对象时调用它。您可以将其视为描述您的类的Class对象的构造函数。与创建实例时调用的构造函数不同。
答案 3 :(得分:0)
你做的方式是完全错误的。只要你的类被加载,静态块只会运行一次。
public class DataProvider {
static int a;
static String b;
static {
a = getSum();
b = "15";
}
public static int getSum(){
return 5 + 6;
}
public static int getRoll() {
return a;
}
}
因此,在这段代码中,只要加载a
类,就会创建变量11
并赋值DataProvider
。并且,关键是除非DataProvider
类不会被重新编译或重新加载,否则此值将相同。即使如果getSum()
每次都返回新值,变量a
也只会包含第一个值。
因此,如果您希望a
是动态的,那么每次您想要访问a
时都会有更新变量:
public static int get_a() {
return a = getSum();
}
答案 4 :(得分:0)
您可以使用 Class.forName(“com.the.ClassName”); 来调用静态块而不会停止该类的任何实例。强>