В Java, там способ получить параметры командной строки, даже если основной () не сохранил их?

var MyDate = new Date();
var MyDateString = '';
MyDate.setDate(MyDate.getDate());
var tempoMonth = (MyDate.getMonth()+1);
var tempoDate = (MyDate.getDate());
if (tempoMonth < 10) tempoMonth = '0' + tempoMonth;
if (tempoDate < 10) tempoDate = '0' + tempoDate;
MyDateString = tempoDate + '/' + tempoMonth + '/' + MyDate.getFullYear();
5
задан Community 23 May 2017 в 12:08
поделиться

4 ответа

Помимо выполнения этого каким-то образом в main, я думаю, единственный другой вариант, который у вас есть, - это перейти на уровень операционной системы и выполнить некоторые команды для получения аргументов.

Вкл. linux аргументы строки cmd для запущенного процесса хранятся в / proc / pid / cmdline

, поэтому, чтобы получить их, вам нужно будет найти идентификатор процесса. См. Здесь:

Как программа на Java может получить собственный идентификатор процесса?

Затем, используя этот открытый / proc / pid / cmdline , проанализируйте его. Формат этого файла и пример в c находятся здесь:

http://www.unix.com/unix-advanced-expert-users/86740-retrieving-command-line-arguments-particular-pid.html

Возможно, лучше всего заключить эти два вызова в один сценарий оболочки, который вы вызываете из java.

Обратите внимание, что это будет крайне непереносимым и немного хакерским. Но если нужно ...

4
ответ дан 13 December 2019 в 22:14
поделиться

Решение становится простым, если вы понимаете, что основной метод Java - это просто еще один статический метод, который принимает массив String в качестве аргумента.

Создайте новый класс, который хранит CLP, а затем вызовет старый класс. Позже вы можете получить доступ к своим CLP, используя новый класс:

import NotToBeChangedMainClass;

public MyMainClass {
  public static final String[] ARGUMENTS;
  public static void main(String ... args) {
    ARGUMENTS = args;
    NotToBeChangedMainClass.main(args);
  }

}

Наконец, измените любой внешний вызывающий объект (например, любые пакетные файлы) на использование MyMainClass вместо NotToBeChangedMainClass. Если вы используете исполняемые jar-файлы или что-то подобное, для этого потребуется изменить соответствующий файл конфигурации.

4
ответ дан 13 December 2019 в 22:14
поделиться

Создайте свой собственный главный класс. Сохраните аргументы. Вызовите старый main .

Возможно, будет проще использовать System.getProperty и -Dkey = value в командной строке (перед именем основного класса или -jar ).

1
ответ дан 13 December 2019 в 22:14
поделиться

Если у вас нет выбора, вам абсолютно необходимо сохранить все существующие имена классов с их точным именем (, как указано в вашем комментарии к моему предыдущему ответу ), тогда вам нужно использовать AspectJ.

Давайте рассмотрим, что у нас есть этот класс:

public class UnmodifyableClassWithMain {
  public static void main(String[] args) {
    System.out.println("In main");
    new ClassUsingArgumentRegistry();
  }
}

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

public class ArgumentRegistry {
  public static String[] ARGS;
}

Затем вам нужно определить Аспект, который перехватывает вызовы к main и сохраняет аргументы.

public aspect StoreArgumentsOfMain {

  /**
   * This pointcut intercepts all calls to methods called main with a string array as
   * argument.
   */
  pointcut mainMethod(String[] arguments): execution(void main(String[])) && args(arguments);

  /**
   * Before the original main method gets called, store the arguments in the registry.
   */
  before(String[] arguments): mainMethod(arguments) {
    System.out.println("Storing arguments");
    ArgumentRegistry.ARGS = arguments;
  }

}

Чтобы опробовать его, я также создал ClassUsingArgumentRegistry:

public class ClassUsingArgumentRegistry {

  public ClassUsingArgumentRegistry() {
    System.out.println("Arguments: " + java.util.Arrays.toString(ArgumentRegistry.ARGS));
  }

}

Это оно. Если я включу ткачество времени компиляции AspectJ и запускаю результат с помощью "java UnmodifyableClassWithMain Foo Bar Baz", я получаю следующий результат:

Storing arguments
In main
Arguments: [foo, bar, baz]
1
ответ дан 13 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: