Под словом «вынуждает разработчика настольного приложения создавать дополнительные компоненты ...», вы имеете в виду, что вы не хотите, чтобы они вообще когда-либо ссылались на имена классов своих приложений? Если это так, то, вероятно, не существует надежного способа сделать это на 100%, но одним из подходов может быть вызов java.awt.Frame.getFrames () и проверка не-java * подклассов JFrame. E.g.:
for (Frame frame in Frame.getFrames()) {
if (frame.getClass().getPackage().getName().startsWith("java"))
continue;
URL manifestURL = frame.getClass().getResource("/META-INF/MANIFEST.MF");
// do something with the manifest
}
Это сломается, если приложение не подклассирует JFrame / Frame самостоятельно, поэтому вы также можете пройтись по дочерним элементам фрейма, чтобы также проверить подклассы дочерних элементов.
Другой подход может заключаться в том, чтобы захватить Thread.getAllStackTraces () и пройти по всем из них (особенно по «основному» потоку) в поисках основного класса, запустившего приложение, а затем получить манифест для этого класса.
Как я уже сказал, вероятно, не существует 100% надежного способа сделать это, так как приложение может не использовать никаких пользовательских подклассов, а стеки для потоков могут иметь смесь различных приложений.