静态代码块可在类加载时读取JVM参数(如-Dapp.env)和环境变量预设配置,通过System.getProperty()等方法赋值给static final变量,实现一次性初始化,但需注意异常处理与执行时机限制。

Java 中静态代码块本身不能直接“实现系统启动参数的预设”,但它可以用来在类加载时读取并初始化那些参数,是预设逻辑的常用执行入口。
静态代码块的作用定位
静态代码块在类第一次被加载(如首次引用该类)时执行一次,且仅执行一次。它适合做一次性初始化工作,比如从 System.getProperty()、System.getenv() 或配置文件中读取启动参数,并赋值给静态变量,供后续使用。
常见预设方式:读取 JVM 启动参数
JVM 启动时可通过 -Dkey=value 设置系统属性,静态代码块可立即捕获这些值:
- 用 System.getProperty("key") 获取 -D 参数(如
-Dapp.env=prod) - 用 System.getenv("KEY") 获取操作系统环境变量(如
export APP_TIMEOUT=3000) - 若未设置,可提供默认值,避免空指针或逻辑异常
典型示例:预设日志级别与超时时间
以下是一个实用写法:
立即学习“Java免费学习笔记(深入)”;
(注意:静态变量需声明为 public static final 或 protected static,确保线程安全和全局可见)public class AppConfig {
public static final String ENV;
public static final int TIMEOUT_MS;
static {
ENV = System.getProperty("app.env", "dev");
String timeoutStr = System.getProperty("app.timeout", "5000");
TIMEOUT_MS = Integer.parseInt(timeoutStr);
System.out.println("Loaded config: env=" + ENV + ", timeout=" + TIMEOUT_MS + "ms");
}
}
只要在应用启动早期(如 main 方法前)触发 AppConfig.class 加载,参数就已就绪。Spring Boot 中常通过 @PostConstruct 或 static {} 配合 ApplicationRunner 做增强,但纯 Java 场景下静态块足够轻量可靠。
注意事项与边界情况
静态代码块执行时机依赖类加载顺序,不是绝对意义上的“系统启动最早点”:
- 如果类从未被主动引用(如只反射加载),静态块可能延迟甚至不执行
- 异常未捕获会导致 NoClassDefFoundError,阻断后续加载,务必加 try-catch 并设合理默认值
- 不建议在静态块中做耗时操作(如远程调用、文件扫描),会影响类加载性能


















