Как определить основной класс во времени выполнения в потоковом JAVA-приложении?

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

curl -X POST -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" -d  

Примечания: синтаксис таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет.

blar'
таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет. ------------------------------4ebf00fbcf09\r\nContent-Disposition: form-data; name="example"\r\n\r\ntest\r\n------------------------------4ebf00fbcf09--\r\n' http://localhost:3000/test

Примечания: синтаксис таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет.

blar' таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет.

18
задан Erik R. 2 June 2009 в 14:37
поделиться

5 ответов

Я разобрался. Может ли кто-нибудь сказать мне, всегда ли эта переменная среды будет присутствовать в других реализациях java в операционных системах? Это в Oracle JVM дает строку типа org.xyClassName

public static String getMainClassName() {
  for (final Map.Entry<String, String> entry : System.getenv().entrySet())
    if (entry.getKey().startsWith("JAVA_MAIN_CLASS")) // like JAVA_MAIN_CLASS_13328
      return entry.getValue();
  throw new IllegalStateException("Cannot determine main class.");
}
2
ответ дан 30 November 2019 в 09:15
поделиться

Попробуйте использовать Thread.getAllStackTraces () . Он возвращает карту трассировки стека для всех запущенных потоков, а не только для текущего.

3
ответ дан 30 November 2019 в 09:15
поделиться

Учитывая пояснение, я предлагаю использовать идиому «Параметризация сверху». У вас есть информация для начала, держите ее.

2
ответ дан 30 November 2019 в 09:15
поделиться

Как насчет чего-то вроде:

Map<Thread,StackTraceElement[]> stackTraceMap = Thread.getAllStackTraces();
for (Thread t : stackTraceMap.keySet())
{
    if ("main".equals(t.getName()))
    {
        StackTraceElement[] mainStackTrace = stackTraceMap.get(t);
        for (StackTraceElement element : mainStackTrace)
        {
            System.out.println(element);
        }
    }
}

Это даст вам что-то вроде

java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:231)
java.lang.Thread.join(Thread.java:680)
com.mypackage.Runner.main(Runner.java:10)

Главный поток, вероятно, не гарантированно называется "основным" , хотя - может быть Лучше проверить элемент трассировки стека, содержащий (main

Edit , если основной поток завершился, это бесполезно!

0
ответ дан 30 November 2019 в 09:15
поделиться

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

Если вы не можете этого сделать, я предлагаю установить свойство в методе main () каждого приложения. Самый простой способ - заставить каждое приложение унаследовать свой «основной класс» от общего базового класса и выполнить там шаг инициализации. Я часто делаю это для обработки командной строки:

public class Demo extends Main {
    main(String[] args) {
        Main._main(new Demo (), args);
    }

    // This gets called by Main._main()
    public void run (String[] args) {
    }
}
0
ответ дан 30 November 2019 в 09:15
поделиться
Другие вопросы по тегам:

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