从静态初始化程序访问主要参数

7

假设:

public class MyClass {

   static {
     // Access to args is needed here
   }

   public static void main(String[] args) {
    ...
   }
}

我希望能在上述静态块中获取args参数。 我知道静态块是在类被加载(或初始化)并在静态main函数之前执行的,但仍然想知道是否有可能访问其args参数。 顺便说一下——我的最终目标是在log4j配置之前(使用从传递给main函数的参数派生的系统属性变量)在运行时将名称追加到日志文件名。

1
不可以,但是你可以直接依赖系统属性。 - biziclop
2个回答

5

你不能从静态块中访问main方法的参数。相反,建议您使用系统参数来代替(或补充)将参数传递给main方法,例如:

java -Dmyvar=value ...

并在静态块内访问它,例如:

static {
    String parameterValue = System.getProperty("myvar");
    ...
}

4

有一个特殊的系统属性“sun.java.command”,其中包含整个命令行。

下面是一个示例:

static {
    System.out.println(System.getProperty("sun.java.command"));
}

当我使用参数aaa bbb运行我的程序时,我得到了以下输出:

com.MyClass aaa bbb

顺便问一下,您知道这是否独立于虚拟机的实现? - Paul Vargas
抱歉,我忘了提到这是针对Sun/Oracle JVM的。不过我相信OpenJDK支持此功能,至于IBM和JRokit是否支持则不得而知。 - AlexR
我只是想知道这是否是反模式。一方面,我们绕过了args数组的注入链,但另一方面,静态初始化器在类加载时被调用,而这又发生在执行main方法之前,似乎在逻辑上是不必要的。 - Sridhar Sarnobat
我确认它在IBM JDK中有效,已在版本1.8.0_291 i386和x86_x64中测试。 - Lyoneel
我之前的评论有一个错误,它在 Semeru JDK 中可以工作,但无法在 iSeries 中工作。 - Lyoneel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接