Можно ли найти имя основного класса, используемого для запуска текущей JVM, из произвольного кода, запущенного в этой JVM?
Произвольным я имею в виду, что код не обязательно работает в основном потоке или может выполняться в основном потоке до того, как main даже был вызван (например, код в поставляемом пользователем java.system.classloader, который выполняется до основного, поскольку он используется для загрузки основного), поэтому проверка стека вызовов невозможна.
Это самое близкое, что я могу получить, и вы можете взять его здесь. Я не могу гарантировать, что он действительно портативен, и он не будет работать, если какой-либо метод вызывает основной метод другого класса. Сообщите мне, если вы найдете больше чистый раствор
import java.util.Map.Entry;
public class TestMain {
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(findMainClass());
}
public static String findMainClass() throws ClassNotFoundException{
for (Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces().entrySet()) {
Thread thread = entry.getKey();
if (thread.getThreadGroup() != null && thread.getThreadGroup().getName().equals("main")) {
for (StackTraceElement stackTraceElement : entry.getValue()) {
if (stackTraceElement.getMethodName().equals("main")) {
try {
Class<?> c = Class.forName(stackTraceElement.getClassName());
Class[] argTypes = new Class[] { String[].class };
//This will throw NoSuchMethodException in case of fake main methods
c.getDeclaredMethod("main", argTypes);
return stackTraceElement.getClassName();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
}
}
return null;
}
}