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

如何在java中调用类的静态块,java,android,Java,Android,我有一个具有静态块的类,如下所示: public class DataProvider { static int a; static String b; static { a = readRollConfiguration(); b = readNameConfiguration(); } public static int getRoll() { return a; } } 我更改了这个类的配置和调用方法,然后得到了较旧的a和b,直到应用程序被终止并重新启动 那

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

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

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


public static int getRoll() {
    return a;
}
}
我更改了这个类的配置和调用方法,然后得到了较旧的ab,直到应用程序被终止并重新启动


那么,有没有办法调用静态块来更新ab

a
b
只加载一次。如果每次调用方法
getRoll
时都要调用方法
readRollConfiguration
readNameConfiguration
,则必须在那里调用该方法

public class DataProvider {

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

a
b
只加载一次。如果每次调用方法
getRoll
时都要调用方法
readRollConfiguration
readNameConfiguration
,则必须在那里调用该方法

public class DataProvider {

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

使用
静态
初始化程序块
初始化静态变量
a
b
的值,作为
数据提供程序
类初始化的一部分,并且除非再次更改
静态
值,否则这些值将相同

因此,更新您的
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
的值
,以设置
数据提供程序
类的最新值。您可以通过使用一个简单的调度器来实现这一点,也可以使用类似的框架来实现缓存层。缓存框架提供了许多用于缓存静态数据的功能,我建议您需要考虑为此类配置数据(即不经常更改的数据)实现缓存.

您正在初始化静态变量
a
b
的值,作为
DataProvider
类初始化的一部分,使用
静态
初始化程序块
进行初始化,除非再次更改
静态
值,否则这些值将相同

因此,更新您的
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
的值
,以设置
数据提供程序
类的最新值。您可以通过使用一个简单的调度器来实现这一点,也可以使用类似的框架来实现缓存层。缓存框架提供了许多用于缓存静态数据的功能,我建议您需要考虑为此类配置数据(即不经常更改的数据)实现缓存。

您不能调用静态块。在创建类对象时调用它。您可以将其视为描述类的类对象的构造函数。与创建实例时调用的构造函数不同。

不能调用静态块。在创建类对象时调用它。您可以将其视为描述类的类对象的构造函数。与创建实例时调用的构造函数不同。

您所采用的方法完全错误。每当加载类时,静态块将只运行一次

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;
    }
}
因此,在这段代码中,每当加载
DataProvider
类时,将创建一个
变量,并为其赋值
11
。关键是,除非
DataProvider
类不会重新编译或重新加载,否则该值将保持不变。甚至,如果
getSum()
每次都返回新值,变量
a
将只包含第一个值

因此,如果您希望
a
是动态的,那么每当您想要访问
a
时,您都有更新变量,如下所示:

public static int get_a() {
    return  a = getSum();
}

你这样做是完全错误的。每当加载类时,静态块将只运行一次

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;
    }
}
因此,在这段代码中,每当加载
DataProvider
类时,将创建一个
变量,并为其赋值
11
。关键是,除非
DataProvider
类不会重新编译或重新加载,否则该值将保持不变。甚至,如果
getSum()
每次都返回新值,变量
a
将只包含第一个值

因此,如果您希望
a
是动态的,那么每当您想要访问
a
时,您都有更新变量,如下所示:

public static int get_a() {
    return  a = getSum();
}

您可以使用Class.forName(“com.the.ClassName”)调用静态块而不调用该类的任何实例。

您可以使用class.forName(“com.the.ClassName”)调用静态块而不调用该类的任何实例。

AFAIK,否。删除所有“静态”,并执行一些不太静态的操作。一个便宜的解决方案是创建一个静态方法,它执行静态块所做的事情(但这不是超级安全的)。静态块的整个点只执行一次——当类从磁盘加载时。如果你想让它在其他时间发生,静态块不是这样做的。好吧,不。去掉所有的“静态”,做一些不太静态的事情。一个便宜的解决方案是创建一个静态方法,它执行静态块所做的事情(但这不是超级安全的)。静态块的整个点只执行一次——当类从磁盘加载时。如果你希望它在其他时间发生,静态块不是这样做的方法。我知道我可以这样做,但我的问题的答案是什么。这可能是个坏主意,getRoll result coul