Получение имени вызова, используемого в Java

Я пытаюсь найти общий способ воспроизвести эту функциональность C:

int main(int argc, char** argv){
    fprintf(2,"%s: error you did something wrong.\n", argv[0]);
    return 1;
}

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

someObj.getClass().getSimpleName();

внутри моего статического основного, не обращаясь к моему собственному классу.

Это вообще возможно?

Редактировать

Мои поиски хорошего часа не привели к этому.

Дублированный вопрос, см. $0 (имя программы) в Java? Откройте основной класс? для ответа


person Flame    schedule 04.04.2009    source источник


Ответы (3)


Способ, которым java находит класс для запуска static void main(), определяется именем, переданным исполняемому файлу java (и пути к классам). Таким образом, основной запуск невозможен, если не было передано правильное имя.

*Ну, если только найденный main не вызывает что-то вроде "FooBar.main()" или не использует загрузчик классов для его поиска.

Даже тогда, поскольку main является статическим, а статические функции не являются виртуальными, все, что вызывает main, вызывается, потому что main вызывается для этого класса. Таким образом, в вашем коде имя (которое не передается в аргументах в main) только в имени класса, в котором находится функция main.

Таким образом, никогда не бывает ошибок, и поэтому никогда не нужно искать имя.

person tpdi    schedule 04.04.2009

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

Хотя это довольно неприглядно. Я бы пересмотрел исходное требование и посмотрел, нет ли более прямого способа добиться того, чего вы хотите.

person nbeyer    schedule 05.04.2009

Я не думаю, что это возможно. Самый простой способ напечатать это - использовать MyClass.class.getSimpleName(), или вы можете создать (не выбрасывать) Throwable, распечатать трассировку стека и перейти оттуда.

person Jorn    schedule 05.04.2009