如何在java中调用类的静态块

时间:2017-04-12 06:01:50

标签: java android

我的类有静态块,如下所示:

public class DataProvider {
static int a;
static String b;

static {
    a = readRollConfiguration();
    b = readNameConfiguration();
}


public static int getRoll() {
    return a;
}
}

我更改了此类的配置和调用方法,然后我获得了较旧的 a b 值,直到应用程序被终止并重新启动。

那么有没有办法调用静态块以便 a b 更新?

5 个答案:

答案 0 :(得分:2)

ab只需加载一次。如果您想在每次调用方法readRollConfiguration时调用方法readNameConfigurationgetRoll,则必须在那里调用该方法。

public class DataProvider {

public static int getRoll() {
    return readRollConfiguration();
}
}

答案 1 :(得分:1)

您正在使用 a初始化程序块初始化静态变量bDataProvider的值作为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;
  }
}
  

是的,我知道它的坏主意,但配置不经常更改。

我强烈建议您定期重新加载ab的值,以便为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”); 来调用静态块而不会停止该类的任何实例。