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

StackOverflow https://stackoverflow.com/questions/718057

  •  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() , или вы могли бы создать (не выбрасывать) выбрасываемый объект, распечатать трассировку стека и перейти оттуда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top