Определить основной класс - PullRequest
3 голосов
/ 20 мая 2010

Как я могу определить основной класс моего приложения? Тот, который либо указан в командной строке, либо загружен из фляги, заданной в командной строке?

Если это невозможно, то почему бы и нет?

РЕДАКТИРОВАТЬ: Может быть, я не был ясен. Я знаю, что всегда может быть много точек входа в мое приложение, но во время работы приложения для запуска текущей JVM использовалась только одна точка входа. Это то, что мне нужно знать.

Ответы [ 4 ]

7 голосов
/ 20 мая 2010

Прежде всего, приложение может иметь несколько точек входа . Это просто класс, который содержит открытый статический метод с именем main с типом аргумента String[].

Итак, короткий ответ, нет , может быть несколько возможных точек входа набора классов.

Если вы хотите перечислить все точки входа приложения, вам просто нужно перебрать классы и найти такой основной метод.

Если вы создадите "исполняемый jar-файл" , в файле манифеста появится запись, похожая на

Main-Class: MyPackage.MyClass

который определяет основной класс приложения.

1 голос
/ 20 мая 2010

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

Throwable t = new Throwable();
StackTraceElement[] elems = t.getStackTrace();
String initClass = elems[elems.length - 1].getClassName();
String initMethod = elems[elems.length - 1].getMethodName();

Это также поможет вам понять, насколько это может быть сложно. Первоначальный основной поток даже не должен больше выполняться. Вы даже можете попытаться поставить эту проверку непосредственно в статическом методе main одного из ваших классов, но все равно не работать правильно. Можно выполнить основной метод из другого класса посредством отражения, и этот инициирующий метод сам может уже выполняться в потоке, отличном от инициирующего.

Для приложений Swing стандартная идиома состоит в том, чтобы позволить инициирующему основному потоку завершаться после активации первой формы. Поэтому в этих случаях вы можете быть уверены, что основной класс и исходный поток больше не работают.

0 голосов
/ 04 февраля 2016

Это довольно чисто: передайте имя класса в качестве аргумента программы из командной строки. Оттуда вы можете создать его с помощью отражения и т. Д.

java foo.bar.MyMainClass foo.bar.MyMainClass
0 голосов
/ 20 мая 2010

Вы можете получить трассировку стека, например,

StackTraceElement[] stack = new Throwable().getStackTrace();

В приложении командной строки последний элемент будет основным классом:

System.out.println(stack[stack.length - 1].getClassName());

Это сложнее для сервлетов, апплетов или других плагинов (нужно перебирать стек, ища классы с тем же ClassLoader, что и у текущего потока.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...