java中static块可于类加载时读取配置,需处理异常、确保线程安全且只初始化一次;应使用classloader.getresourceasstream()获取资源,捕获ioexception并抛出illegalstateexception,避免静默失败。

Java 中可以通过 static 块在类加载时读取配置文件,但需注意时机、异常处理和线程安全问题。核心是确保配置只初始化一次,且在任何实例创建前完成。
static 块读取配置的基本写法
static 块会在类首次被加载(如首次访问该类的静态成员或创建实例)时执行一次。适合用于一次性加载配置并赋值给 static 字段:
- 用
InputStream或Files.readAllLines()读取 classpath 下的配置文件(如config.properties) - 将解析结果存入
static final或static变量中(如Properties对象或自定义配置类) - 推荐使用
ClassLoader.getResourceAsStream()获取 classpath 资源,避免路径硬编码
必须处理 checked 异常
static 块不能抛出受检异常(如 IOException),因此需用 try-catch 捕获并妥善处理:
- 记录日志(如用
java.util.logging或 SLF4J),避免静默失败 - 可设默认值或抛出
RuntimeException(如new IllegalStateException("Failed to load config", e))让类加载失败,防止后续使用错误配置 - 不要用空
catch,否则配置加载失败却无提示,极易引发隐蔽 bug
注意类加载顺序与线程安全
static 块由 JVM 保证在类初始化阶段单线程执行,天然线程安全;但要注意依赖关系:
- 若配置类被多个类引用,确保它不依赖其他尚未初始化的
static成员 - 避免在
static块中调用可能触发其他类初始化的方法(尤其是存在循环依赖时) - 如果配置需动态刷新,
static块不合适——应改用懒加载 + 双重检查锁,或使用 Spring 等框架的配置管理机制
一个简洁可用的例子
假设 classpath 下有 app.properties:
db.url=jdbc:h2:mem:test app.timeout=3000
对应读取代码:
public class Config {
private static final Properties props = new Properties();
static {
try (InputStream is = Config.class.getClassLoader().getResourceAsStream("app.properties")) {
if (is == null) {
throw new IllegalStateException("app.properties not found in classpath");
}
props.load(is);
} catch (IOException e) {
throw new IllegalStateException("Failed to load app.properties", e);
}
}
public static String getDbUrl() { return props.getProperty("db.url"); }
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











