как получить аргументы командной строки из другого класса с Java - PullRequest
11 голосов
/ 21 февраля 2011

Итак, предположим, у меня есть пакет Java ....

есть основной класс с методом main

а потом у него есть целая куча других классов .....

У меня вопрос: возможно ли получить аргументы, переданные в метод main, из этих других классов, которые не являются частью основного класса, но находятся в одном пакете ...

Ответы [ 5 ]

11 голосов
/ 21 февраля 2011

Нет, не переносимо, могут быть некоторые хитрости, основанные на реализации JVM, но я никогда не видел это, и было бы очень плохой идеей полагаться на него, даже если бы он существовал.

Еслиесли вы хотите получить эти значения в другом месте, функция main должна как-то сделать их доступными.


Простой способ сделать это (не обязательно способ best ) - просто сохранитьуберите строки как первое, что есть в 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] + "]");
        }
    }
}

И, при запуске с аргументами a b c, это выводит:

Arg count is [3]
Arg[0] is [a]
Arg[1] is [b]
Arg[2] is [c]
5 голосов
/ 16 января 2017

Системные свойства в некоторых (?) JRE-реализациях предоставляют системное свойство "sun.java.command" для получения имени программы и параметров, которые использовались для запуска программы.Например, «myjar.jar param1 param2 ...».

Хотя это значение даже не относится к набору свойств, упомянутых в документации, оно присутствует как в Oracle-JRE v1.8, так и вOpenJRE v1.8 (протестировано).

Я не смог найти никакой документации, поддерживается ли это значение по умолчанию, хотя (лучше всего я нашел список в System#getProperties() документах).Любые разъяснения по этому поводу будут приветствоваться.Обращаться с осторожностью !!!

4 голосов
/ 21 февраля 2011

Если вас не волнует переносимость ОС, прочитайте /proc/self/cmdline или эквивалент для вашей ОС.

См. http://en.wikipedia.org/wiki/Procfs

1 голос
/ 21 февраля 2011

Как сказал paxdiablo, ваш основной класс должен будет хранить эти параметры, а затем либо распространять, либо предоставлять их другим.Часто хорошей идеей будет позволить другому классу выполнить синтаксический анализ этих параметров и предоставить объект этого класса вместо необработанной командной строки тому, кто в ней нуждается.

0 голосов
/ 21 февраля 2011

Я вроде как новичок в этом, но вы должны быть в состоянии сохранить строковые аргументы [] в частной переменной экземпляра, а затем создать метод доступа для нее.Например,

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

Не уверен, что это будет работать, но это идея.

...