如何使用java从另一个类获取命令行参数

所以假设我有一个java包….

它有主要方法的主类

然后它有一大堆其他类……

我的问题是,是否有可能从这些其他类中获取传递给main方法的args,这些类不是主类的一部分,而是在同一个包中…

不,不可移植,可能有一些基于JVM实现的技巧,但我从未见过它,即使它存在也依赖它是一个非常糟糕的主意。

如果你想在其他地方使用这些值,那么main函数需要以某种方式使它们可用。


一个简单的方法(不一定是最好的方法)是简单地将字符串存储为main的第一个东西并提供获取它们的方法:

Scratch2.java:

 public class Scratch2 { // Arguments and accessor for them. private static String[] savedArgs; public static String[] getArgs() { return savedArgs; } public static void main(String[] args) { // Save them away for later. savedArgs = args; // Test that other classes can get them. CmdLineArgs cla = new CmdLineArgs(); cla.printArgs(); } } 

CmdLineArgs.java:

 public class CmdLineArgs { public void printArgs() { String[] args = Scratch2.getArgs(); System.out.println ("Arg count is [" + args.length + "]"); for (int i = 0; i < args.length; i++) { System.out.println ("Arg[" + i + "] is [" + args[i] + "]"); } } } 

并且,当使用参数abc运行时,此输出:

 Arg count is [3] Arg[0] is [a] Arg[1] is [b] Arg[2] is [c] 

某些(?)JRE实现的系统属性提供系统属性“sun.java.command”以获取用于启动程序的programm-name和参数。 比如“myjar.jar param1 param2 ……”。

虽然此值甚至不属于文档中提到的属性集,但它存在于Oracle-JRE v1.8和OpenJRE v1.8(已测试)中。

我找不到任何文档是否默认支持此值(我最好能找到System#getProperties()文档中的列表)。 对此有任何澄清将是受欢迎的。 小心轻放!!!

如果您不关心操作系统的可移植性,请阅读/proc/self/cmdline或操作系统的等效项。

见http://en.wikipedia.org/wiki/Procfs

正如paxdiablo所说,你的主要类必须存储这些参数,然后分发或提供给所需的参数。 通常一个好主意是让另一个类对这些参数进行解析,并为需要它的人提供此类的对象而不是原始命令行。

我在这方面有点新意,但你应该能够将字符串[] args存储到私有实例变量中,然后为它创建一个访问器方法。 例如,

 public class test { private String[] myArgs = new String[10]; public static void main(String[] args) { myArgs = args; } public String[] getArgs() { return myArgs; } } 

不确定它是否会起作用,但这就是主意。