Получение имени вызова, используемого в Java
-
23-08-2019 - |
Вопрос
Я пытаюсь найти общий способ воспроизвести эту функциональность C:
int main(int argc, char** argv){
fprintf(2,"%s: error you did something wrong.\n", argv[0]);
return 1;
}
на языке Java.До сих пор единственным способом было жестко закодировать это в приложении, что некрасиво.Я бы хотел получить что-то похожее на:
someObj.getClass().getSimpleName();
внутри моего статического основного, не возвращаясь к моему собственному классу.
Возможно ли это вообще?
Редактировать
Мои поиски в течение целого часа не привели к этому.
Дублированный вопрос, см. $ 0 (Название программы) на Java?Открыть для себя основной класс? для ответа
Другие советы
Способ, которым java находит класс, в котором нужно запускать static void main()
определяется именем, переданным исполняемому файлу java (и путем к классу).Таким образом, основной запуск невозможен, если не было передано правильное имя.
* Ну, если только найденный main не вызывает что-то вроде "FooBar.main()" или не использует загрузчик классов для его поиска.
Даже тогда, поскольку main является статическим, а статические функции не являются виртуальными, независимо от того, что вызывается main, вызывается потому, что main был вызван в этом классе.Итак, в вашем коде имя (которое не передается в аргументах в main) только в имени класса, который main
функция включена.
Таким образом, никогда не возникает ошибки, и поэтому никогда не нужно искать имя.
Единственное, о чем я могу думать, это о том, что вы определяете, какой поток является основным, получаете трассировку стека этого потока, а затем возвращаетесь к началу стека и запрашиваете имя класса и имя метода элемента, чтобы увидеть, то ли это, что вы хотите.
Хотя это довольно мерзко.Я бы пересмотрел первоначальное требование и посмотрел, нет ли более простого способа достичь того, чего вы хотите.
Я не думаю, что это возможно.Самый простой способ распечатать это - использовать MyClass.class.getSimpleName() , или вы могли бы создать (не выбрасывать) выбрасываемый объект, распечатать трассировку стека и перейти оттуда.