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

如何使用java从另一个类获取命令行参数,java,class,command-line,command,main,Java,Class,Command Line,Command,Main,假设我有一个java包 它有main类和main方法 还有一大堆其他的课程 我的问题是,是否有可能从这些不属于主类但在同一个包中的其他类获取传递到主方法的参数…不,不可移植,可能有一些基于JVM实现的技巧,但我从未见过,即使它存在,依赖它也不是一个好主意 如果您想在其他地方使用这些值,则main函数需要以某种方式使它们可用 一种简单的方法(不一定是最好的方法)是将字符串作为第一件事存储在main中,并提供获取它们的方法: Scratch2.java: public class Scratch2

假设我有一个java包

它有main类和main方法

还有一大堆其他的课程


我的问题是,是否有可能从这些不属于主类但在同一个包中的其他类获取传递到主方法的参数…

不,不可移植,可能有一些基于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();
    }
}
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] + "]");
        }
    }
}
CmdLineArgs.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();
    }
}
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] + "]");
        }
    }
}

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

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


请参见

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


不确定它是否能工作,但这就是想法。

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

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


但是,我找不到任何文档说明默认情况下是否支持此值(我能找到的最好的文档是
System\getProperties()
docs中的列表)。欢迎对此作出任何澄清。小心轻放

这里重复一些额外的信息:为什么调用
getArgs()
methodfind bug时不需要
Scratch2
类的对象给我一个错误,说
通过返回数组来暴露内部表示形式
。我克隆了这个数组,但是如果main.jar(包含main类)正在使用mylib.jar,而mylib.jar是由另一个不想依赖common.jar的组开发的(main.jar和mylib.jar可能都使用这个错误,jar用于包含args的Util类(由main.jar中的main类设置))。i、 e.这个解决方案无法推广。@Yerlibilgin:您不妨问“如果您有禁止访问main以外参数的编码标准怎么办?”或者“如果您的同事都不接受您的请求进行这样的更改怎么办?”。我的回答解决了获取论据的技术问题,这正是问题所要求的。如果你想解决技术上任意限制的问题,可能应该作为一个单独的问题提问,可能在另一个网站上提问,因为它涉及工作场所关系,而不是编码本身。@yerlilbilgin我很高兴你喜欢我的答案:D。然而,解决这个问题的方法是相当不安全的,因为它不是标准化的(AFAIK),在大多数情况下可能有效,但不需要。如果你想安全起见,我建议你使用。不过,这是一个很好的破解:)不,我还是喜欢你的答案。在某些情况下,我需要读取cmd行参数,但它位于主库使用的库中。我不想创建一个“公共实用程序类”,它由库和设置参数使用。所以,就我不太喜欢多操作系统(目前的项目仅限于Windows)而言,我更喜欢你的答案。