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();
Помимо выполнения этого каким-то образом в main, я думаю, единственный другой вариант, который у вас есть, - это перейти на уровень операционной системы и выполнить некоторые команды для получения аргументов.
Вкл. linux аргументы строки cmd для запущенного процесса хранятся в / proc / pid / cmdline
, поэтому, чтобы получить их, вам нужно будет найти идентификатор процесса. См. Здесь:
Как программа на Java может получить собственный идентификатор процесса?
Затем, используя этот открытый / proc / pid / cmdline , проанализируйте его. Формат этого файла и пример в c находятся здесь:
Возможно, лучше всего заключить эти два вызова в один сценарий оболочки, который вы вызываете из java.
Обратите внимание, что это будет крайне непереносимым и немного хакерским. Но если нужно ...
Решение становится простым, если вы понимаете, что основной метод 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-файлы или что-то подобное, для этого потребуется изменить соответствующий файл конфигурации.
Создайте свой собственный главный класс. Сохраните аргументы. Вызовите старый main
.
Возможно, будет проще использовать System.getProperty
и -Dkey = value
в командной строке (перед именем основного класса или -jar
).
Если у вас нет выбора, вам абсолютно необходимо сохранить все существующие имена классов с их точным именем (, как указано в вашем комментарии к моему предыдущему ответу ), тогда вам нужно использовать 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]