Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > получить ссылку на обьект содержащий main()


Автор: _Y_ 7.12.2011, 14:47
Как бы програмно получить ссылку на обьект содержащий main().

Программа может стартовать по-разному; т.е. имеется несколько классов, содержащих метод main(). Один из вариантов, конечно, сделать где-то статическую переменную
public static Object mainObject;
в которую при старте записывать ссылку на нужный класс. Но это как-то коряво получается. 

Нет ли возможности получить эту ссылку програмно?

ЗЫ: Нарыл в старых темах http://forum.vingrad.ru/index.php?showtopic=289420&view=findpost&p=2083478, но оно, вроде, позволяет только узнать имя стартовавшего класса, но не получить ссылку на стартовавший обьект.

Автор: Stolzen 7.12.2011, 14:54
Может есть что-то у JarClassLoader? Или у того класслоадера, который запускает приложение через entry point

Автор: jk1 7.12.2011, 14:55
Цитата

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


Какой объект? метод main статический, то есть принадлежит классу

Автор: LSD 7.12.2011, 15:28
Если поток main() еще жив, то можно вызвать getStackTrace() из из него получит имя класса. Если он уже завершился, то надо получать строку запуска через API ОС.

Автор: Stolzen 7.12.2011, 15:36
Цитата(LSD @  7.12.2011,  16:28 Найти цитируемый пост)
Если он уже завершился, то надо получать строку запуска через API ОС.

А как?

Автор: _Y_ 7.12.2011, 15:41
Цитата(jk1 @  7.12.2011,  14:55 Найти цитируемый пост)
Какой объект? метод main статический, то есть принадлежит классу 


Прошу прощения. Конечно так. Неграмотно сформулировал вопрос. А вот как его сформулировать.....

Собственно, обычно  main у меня первым делом создает экземпляр класса, в котором находится.... Но это, конечно, частный случай.

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

Пожалуй вопрос надо переформулировать так:
Как из кода метода получить ссылки на вызвавшие его обьекты подобно тому как new Exception().getStackTrace() возвращает список их имен (да и не только имен)?

Еще раз извиняюсь за формулировку.

Добавлено через 1 минуту и 59 секунд
LSD, main() у меня вечноживой, но нужно не имя класса, а именно ссылка на обьект, или, лучше ссылки на иерархию вызвавших данный код обьектов.

Автор: jk1 7.12.2011, 15:56
Я бы рекомендовал трэкать такие объекты самому, то есть сохранять куда-то при старте. Как Вы сами говорите, создание объекта в результате вызова main это только частный случай, и наивно было бы ожидать тут поддержки со стороны API.

И да, вместо new Exception().getStackTrace() можно использовать Thread.currentThread().getStackTrace(). Как-то поизящнее выглядит.

Автор: LSD 7.12.2011, 17:19
Цитата(Stolzen @  7.12.2011,  16:36 Найти цитируемый пост)
А как?

Ну это уже зависит от ОС. В любом случае придется как-то через JNI вызывать ОС API.



Цитата(_Y_ @  7.12.2011,  16:41 Найти цитируемый пост)
нужно не имя класса, а именно ссылка на обьект, или, лучше ссылки на иерархию вызвавших данный код обьектов

Никак не получить. Если бы так можно было бы сделать, то это была бы дыра в безопасности.

Автор: _Y_ 7.12.2011, 18:57
Цитата(jk1 @  7.12.2011,  15:56 Найти цитируемый пост)
Thread.currentThread().getStackTrace(). Как-то поизящнее выглядит.


Действительно изящнее.


Цитата(LSD @  7.12.2011,  17:19 Найти цитируемый пост)
Если бы так можно было бы сделать, то это была бы дыра в безопасности. 


Спасибо. Вопрос снят как дурацкий  smile 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)